打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
聚合查询、聚合函数

用法:

from django.db.models import Avg,Sum,Max,Count,Min聚合:示例:models.Book.object.all().aggregate(Avg("price"))你也可以在聚合子句中用它models.Book.object.aggregate(average_price=Avg('price'))你也可以连续的使用models.Bool.object.all().aggregate(Avg("price"),Max("price"),Min("price"))分组查询统计每一本书的作者的个数models.Book.object.all().annotate(author_num=Count("author"))统计出每个出版社卖的最便宜的书的价格sss统计不止一个作者的书models.Book.object.annotate(author_num=Count("author")).filter(author_num__get=1)查询各个作者出的书的总价格models.Author.object.annotate(sum_price=Sum("book__price")).values("name","sum_price")

总结

value里面的参数对应的是sql语句中的select要查找的显示字段,

filter里面的参数相当于where或者having里面的筛选条件,

annotate本身表示group by的作用,前面找寻分组的依据,内部放置显示可能用到的聚合运算式,后面跟filter来增加限制条件,最后的value来表示分组想要查找的字段

F与Q查询

F查询:Django提供F()来做比较查询,F()的实例可以在查询中引用字段,来比教同一个model实例中两个不同的字段的值.示例:1.查询出卖出数大于库存数的书籍from django.db.models import F  #先导入F模块res = models.Book.objects.filter(maichu__gt=F('kuncun'))F可以帮我们取到某个字段对应的值来当做我的筛选条件,而不是我指定的了,他实现了一个动态比较的效果.Django支持F()对象之间以及F()对象和常数之间的加减乘除和取模的操作.基于此我们就可以对表中的数值类型进行数学运算2.将每个书籍的价格提高50元models.Book.objects.update(price=F('pirce') 50) #很简单吧.3.拼接char字段.如: 我们要把书名后面加上'新款'(这个时候需要对字符串进行拼接Concat操作,并且要加上拼接值(Value)from django.db.models.functions import Concatfrom django.db.models import Valuesres = models.Book.object.update(name=Concat(F('name').Value('新款')))Concat表示的是进行字符串的拼接操作,参数位置决定了拼接在头部还是在尾部,Value里面是要新增的拼接值
Q查询filter()等方法中用逗号隔开的条件是与的关系.如果你想要执行更复杂的语句(例如or语句).你可以使用Q对象.示例:1.查询出卖出数大于100或者价格小于100块的from django.db.models import Q   #导入Q模块models.Book.objects.filter(Q(maichu__gt=100)|Q(price__lt=100)) #对条件包裹Q,实现或者2.示例:查询库存数是100并且卖出数不是0的数models.Book.object.filter(Q(kucun=100)&`Q(maichu=0))&表示并且,`表示取反

事务

事务的定义:将多个sql语句操作变成原子性操作,要么同时成功,有一个失败则回滚到原来的状态,保证数据的完整性和一致性

#django开启事务事务四大特性: 原子性, 一致性, 隔离性, 持久性from django.db import transactionwith transaction.atomic():

几个重要的方法比较

update()和save()的区别

两者都是对数据的修改保存操作,但是save()函数是将数据列的全部数据项全部都重新写一遍,而update()则是针对修改的项进行针对的更新它频率高耗时少

select_related和prefetch_related

def select_related(self, *fields)    性能相关:表之间进行join联表操作,一次性获取关联的数据        总结:      1.select_related主要针对一对一和多对一的关系进行优化      2.select_related使用sql的join语句进行优化,减少sql的查询次数,来提高性能def prefetch_related(self, *lookups)    性能相关: 多表联表操作时速度会很慢,它是使用多次sql查询在python中实现联表操作        总结:      1.对于多对多字段和一对多字段,可以使用prefetch_related()来进行优化      2.prefetch_related()的优化方式是分别查询每个表,然后用python来处理他们之间的关系

方法大全

def all(self)    #获取所有的数据对象    def filter(self, *args, **kwargs)    #条件查询    #条件可以是: 参数, 字典, Qdef exclude(self, *args, **kwargs)    # 条件查询    # 条件可以是:参数,字典,Qdef select_related(self, *fields)    性能相关:表之间进行join连表操作,一次性获取关联的数据。    总结:    1. select_related主要针一对一和多对一关系进行优化。    2. select_related使用SQL的JOIN语句进行优化,通过减少SQL查询的次数来进行优化、提高性能。def prefetch_related(self, *lookups)    性能相关:多表连表操作时速度会慢,使用其执行多次SQL查询在Python代码中实现连表操作。    总结:    1. 对于多对多字段(ManyToManyField)和一对多字段,可以使用prefetch_related()来进行优化。    2. prefetch_related()的优化方式是分别查询每个表,然后用Python处理他们之间的关系。def annotate(self, *args, **kwargs)    # 用于实现聚合group by查询    from django.db.models import Count, Avg, Max, Min, Sum    v = models.UserInfo.objects.values('u_id').annotate(uid=Count('u_id'))    # SELECT u_id, COUNT(ui) AS `uid` FROM UserInfo GROUP BY u_id    v = models.UserInfo.objects.values('u_id').annotate(uid=Count('u_id')).filter(uid__gt=1)    # SELECT u_id, COUNT(ui_id) AS `uid` FROM UserInfo GROUP BY u_id having count(u_id) > 1    v = models.UserInfo.objects.values('u_id').annotate(uid=Count('u_id',distinct=True)).filter(uid__gt=1)    # SELECT u_id, COUNT( DISTINCT ui_id) AS `uid` FROM UserInfo GROUP BY u_id having count(u_id) > 1def distinct(self, *field_names)    # 用于distinct去重    models.UserInfo.objects.values('nid').distinct()    # select distinct nid from userinfo    注:只有在PostgreSQL中才能使用distinct进行去重def order_by(self, *field_names)    # 用于排序    models.UserInfo.objects.all().order_by('-id','age')def extra(self, select=None, where=None, params=None, tables=None, order_by=None, select_params=None)    # 构造额外的查询条件或者映射,如:子查询    Entry.objects.extra(select={'new_id': "select col from sometable where othercol > %s"}, select_params=(1,))    Entry.objects.extra(where=['headline=%s'], params=['Lennon'])    Entry.objects.extra(where=["foo='a' OR bar = 'a'", "baz = 'a'"])    Entry.objects.extra(select={'new_id': "select id from tb where id > %s"}, select_params=(1,), order_by=['-nid']) def reverse(self):    # 倒序    models.UserInfo.objects.all().order_by('-nid').reverse()    # 注:如果存在order_by,reverse则是倒序,如果多个排序则一一倒序 def defer(self, *fields):    models.UserInfo.objects.defer('username','id')    或    models.UserInfo.objects.filter(...).defer('username','id')    #映射中排除某列数据 def only(self, *fields):    #仅取某个表中的数据     models.UserInfo.objects.only('username','id')     或     models.UserInfo.objects.filter(...).only('username','id') def using(self, alias):     指定使用的数据库,参数为别名(setting中的设置)
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Django之ORM操作
python models操作
一篇文章带你了解Django ORM操作(基础篇)
Python工程师详细讲解Django之model,弄懂了马上升职加薪(附源码)
Django之model详解
Django的一些学习demo说明
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服