Django ORM的一般操作


ORM的一般操作

#13个必会的orm操作

#all全查询
# res=models.Book.objects.all() #QS类型
# print(res)

#filter筛选查询
# res=models.Book.objects.filter(zuozhe=3)#QS类型
# print(res)

#gai筛选取对象查询
# res=models.Book.objects.get(id=3) #对象
# print(res)

#exclude去除查询,除了这个参数,其他都显示
# res=models.Book.objects.exclude(id=4) #QS类型
# print(res)

#values获取值,以字典的形式存储
# res=models.Book.objects.filter(id=3).values() #QS类型字典
# print(res)

# res=models.Book.objects.values('title','time')
# print(res)

#values_list获取值,以元组的方式存储
# res=models.Book.objects.filter(id=3).values_list() #QS类型元组
# print(res)

#order_by根据某个属性,排序
# res=models.Book.objects.all().order_by('time')
# print(res)

#reverse反向排序,只能反向以排序的值
# res=models.Book.objects.all().order_by('time').reverse() #QS类型
# print(res)

#filter去重
# res=models.Book.objects.filter()

#count对象个数
# res=models.Book.objects.count() #数值
# print(res)

#first最上面的一个对象
# res=models.Book.objects.first() #对象
# print(res)

#last最下面的一个对象
# res=models.Book.objects.last() #对象
# print(res)

#exists判断是否有值
# res=models.Book.objects.exists() #布尔
# print(res)

#神奇的下划线

#gt 大于
# res=models.Book.objects.filter(id__gt=4)
# print(res)

#gte 大于等于
# res=models.Book.objects.filter(id__gte=4)
# print(res)

#lt 小于
# res=models.Book.objects.filter(id__lt=5)
# print(res)

#lte 小于等于
# res=models.Book.objects.filter(id__lte=5)
# print(res)

#gt和lt连用,大于且小于
# res=models.Book.objects.filter(id__gt=3,id__lt=6)
# print(res)

#in 获取列表内选定的
# res=models.Book.objects.filter(id__in=[3,6])
# print(res)
# <QuerySet [<Book: aaa>, <Book: ddd>]>

#用exclude的话,相当于,not in,获取列表里以外的
# res=models.Book.objects.exclude(id__in=[5,6])
# print(res)
# <QuerySet [<Book: aaa>, <Book: bbb>]>

#isnull 判断字段是否为空,后面跟True就找出是空的对象,如果跟False,则找出不为空对象
# res=models.Book.objects.filter(kong2__isnull=True)
# print(res)
# <QuerySet [<Book: aaa>, <Book: ccc>]>

#contains 模糊查询,对应值中包含写入参数的,icontains不区分大小写的查询
# res=models.Book.objects.filter(title__contains='c')
# print(res)
# <QuerySet [<Book: ccc>]>

#range列表内限定范围查询同bettwen and
# res=models.Book.objects.filter(id__range=[3,5])
# print(res)
# <QuerySet [<Book: aaa>, <Book: bbb>, <Book: ccc>]>

# startswith 以书面开头,istartswith 忽略大小写以书面开头, endswith 以什么结尾, iendswith忽略大小写以书面结尾

# regex正则匹配,iregex 不区分大小写
# res=models.Book.objects.filter(title__regex=r'aaa|bbb')
# print(res)
# res=models.Book.objects.filter(title__iregex=r'AAA|BBB')
# print(res)
# <QuerySet [<Book: aaa>, <Book: bbb>]>
# <QuerySet [<Book: aaa>, <Book: bbb>]>

#date,具体时间,year,年,month,月,day,日,week_day,星期几,hour,小时,minute,分,second,秒
#______________________________________________________________________
# res=models.Book.objects.filter(time__date=datetime.date(2018,6,21))
# print(res)
#______________________________________________________________________
# res=models.Book.objects.filter(time__day=21)
# print(res)
# <QuerySet [<Book: aaa>]>

#外键的正向查询
# 对象直接点外键字段名,获取对象
# obj=models.Book.objects.first()
# res=obj.cbs
# print(res,type(type))

#用外键表名__来跨表查询
# res=models.Book.objects.filter(id=3).values('cbs__name')
# print(res)
# <QuerySet [{'cbs__name': '第一出版社'}]>

#外键的反向查询
#对象点反向外键类名_set,来获取对象列表
# obj=models.Cbs.objects.first()
# res=obj.book_set.first()
# print(res)
#related_name,赋值可以代替类名_set,入代替book_set,related_query_name赋值可以代替表名,用于关联动态表时或QS类型时

#用外键表名__来跨表查询
# res=models.Cbs.objects.filter(id=3).values('book__title')
# print(res)
# <QuerySet [{'book__title': 'ccc'}]>

#多对多
# create 创建关联的
# obj=models.Zuozhe.objects.first()
# obj.book_set.create(title='eeee',time=datetime.datetime.now,money=300,cbs_id=1,kong='a',kong2='aaa')

#add 加入可用添加关联的对象,也可用id添加 ,添加多个要用*把列表打散添加
# z_obj=models.Zuozhe.objects.get(id=2)
# s_obj=models.Book.objects.get(id=7)
# z_obj.book_set.add(s_obj)
# d_obj=models.Book.objects.exclude(id__regex=r'4|5|7')
# print(d_obj)
# z_obj.book_set.add(*d_obj)

#remove 删除关联的,可用对象,可用id
# b_obj=models.Book.objects.get(id=7)
# z_obj=models.Zuozhe.objects.get(id=2)
# z_obj.book_set.remove(b_obj)

#clear 清除所有关联的
# z_obj=models.Zuozhe.objects.get(id=2)
# z_obj.book_set.clear()

#注意外键反向操作时,只有null=True时,才有clear和remove功能

# 聚合查询

#需要导入
from django.db.models import Avg, Sum, Max, Min, Count,Value

#调用方法聚合处理
# ret=models.Book.objects.aggregate(sum_money=Sum('money'))
# print(ret)
# {'sum_money': Decimal('1900.00')}

#调用多个方法以逗号分隔
# ret=models.Book.objects.aggregate(sum_money=Sum('money'),max=Max('money'),min=Min('money'))
# print(ret)
# {'sum_money': Decimal('1900.00'), 'max': Decimal('800.00'), 'min': Decimal('100.00')}

# 分组查询

#annotate分组 前values筛选分组,不写默认全分组,后面values得值
# ret=models.Book.objects.annotate(shu=Count('zuozhe')).values('title','shu')
# print(ret)

# res=models.Book.objects.values('cbs_id').annotate(he=Sum('money')).values('cbs_id','he')
# print(res)

# 练习题:
# 1.统计每一本书的作者个数
# ret=models.Book.objects.annotate(shu=Count('zuozhe')).values('title','shu')
# print(ret)

# 2.统计出每个出版社买的最便宜的书的价格
# ret=models.Cbs.objects.annotate(pianyi=Min('book__money')).values('name','pianyi')
# print(ret)
# 3.统计不止一个作者的图书
# ret=models.Book.objects.annotate(shu=Count('zuozhe')).filter(shu__gt=1).values('title','shu')
# print(ret)
# 4.根据一本图书作者数量的多少对查询集 QuerySet进行排序
# ret=models.Book.objects.annotate(shu=Count('zuozhe')).order_by('shu').reverse()
# print(ret)
# 5.查询各个作者出的书的总价格
# ret=models.Zuozhe.objects.annotate(shu=Sum('book__money')).values('name','shu')
# print(ret)

#F查询 #字段与字段之间
# 需要导入
from django.db.models import F

#F 用于字段与字段之间的查找,支持运算符号
# ret=models.Book.objects.filter(maichu__gt=F('kuchun')).values('maichu','kuchun')
# print(ret)

#update F中用于更新,只用于数字
# models.Book.objects.update(maichu=F('maichu')+10)

#字符串添加需要导入Concat
from django.db.models.functions import Concat

#字符串添加 Concat拼接 Value值 F取原值,Value填你想拼接的值,最后用Concat拼接
# models.Book.objects.update(title=Concat(F('title'),Value('g')))

# Q查询 #逻辑符号
#需要导入
from django.db.models import Q

#Q 用于多个字段之间运用与& 或| 非~ 操作
# ret=models.Book.objects.filter(Q(maichu__gt=50) & Q(money__gt=500)).values('money','maichu')
# print(ret)
# < QuerySet[{'money': Decimal('800.00'), 'maichu': 60}] >

#带关键字参数的话,关键字参数必须放在Q参数后面
# ret=models.Book.objects.filter(Q(money__lt=500) & ~Q(kuchun=50),cbs_id=2)
# print(ret)
# < QuerySet[ < Book: dddg >] >

# 事务 #事务内的代码块必须全部执行成功才会执行,出现一个错误,整个都会变回原样

#必须导入
from django.db import transaction

# try:
# with transaction.atomic():
# models.Cbs.objects.create(name='逗比出版社',chenghsi='逗比星')
# models.Zuozhe.objects.create(name='gg',age=18,dianhua=18888888,xiangqing_id=8)
#
# except Exception as e:
# print(e)



# Django终端打印SQL语句
# 在Django项目的settings.py文件中,在最后复制粘贴如下代码:

# LOGGING = {
# 'version': 1,
# 'disable_existing_loggers': False,
# 'handlers': {
# 'console':{
# 'level':'DEBUG',
# 'class':'logging.StreamHandler',
# },
# },
# 'loggers': {
# 'django.db.backends': {
# 'handlers': ['console'],
# 'propagate': True,
# 'level':'DEBUG',
# },
# }
# }


# 在Python脚本中调用Django环境

#新建py文件,复制代码,注意导入models,是你要用的app名字,下面app01只是例子

# import os
#
# if __name__ == '__main__':
# os.environ.setdefault("DJANGO_SETTINGS_MODULE", "BMS.settings")
# import django
# django.setup()
#
# from app01 import models
#



原文地址:https://www.cnblogs.com/yangli0504/p/9215347.html