Django框架08 /聚合查询分组F查询和Q查询执行原生sql设置 sql_mode
Posted LBZHK
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django框架08 /聚合查询分组F查询和Q查询执行原生sql设置 sql_mode相关的知识,希望对你有一定的参考价值。
目录
Django框架08 /聚合查询、分组、F查询和Q查询、执行原生sql、设置 sql_mode
1.聚合查询
aggregate(*args, **kwargs)
aggregate()是QuerySet 的一个终止子句,意思是说,它返回一个包含一些键值对的字典。键的名称是聚合值的标识符,值是计算出来的聚合值。键的名称是按照字段和聚合函数的名称自动生成出来的。如果你想要为聚合值指定一个名称,可以向聚合子句提供它。
#示例
# 计算所有图书的平均价格
>>> from django.db.models import Avg
>>> Book.objects.all().aggregate(Avg('price'))
#结果:
{'price__avg': 34.35}
>>> Book.objects.all().aggregate(a=Avg('price')) #或者给它起名字:aggretate(a=Avg('price'))
#结果:
{'a': 34.35}
>>> Book.objects.aggregate(average_price=Avg('price'))
#结果:
{'average_price': 34.35}
如果你希望生成不止一个聚合,你可以向aggregate()子句中添加另一个参数。所以,如果你也想知道所有图书价格的最大值和最小值,可以这样查询:
>>> from django.db.models import Avg, Max, Min
>>> Book.objects.aggregate(Avg('price'), Max('price'), Min('price')) #count('id'),count(1)也可以统计个数,Book.objects.all().aggregete和Book.objects.aggregate(),都可以
#结果:
{'price__avg': 34.35, 'price__max': Decimal('81.20'), 'price__min': Decimal('12.99')}
2.分组
annotate
# models.Publish.objects.annotate(a=Avg('book__price')).values('a')
# models.Book.objects.values('publish_id','id').annotate(a=Avg('price')) {'pulish_id':1,'a':11.11}
#注意:annotate里面必须写个聚合函数,不然没有意义,并且必须有个别名=,别名随便写,但是必须有,用哪个字段分组,values里面就写哪个字段,annotate其实就是对分组结果的统计,统计你需要什么。
分组后排序:
Book.objects.annotate(num_authors=Count('authors')).order_by('num_authors')
3.F查询和Q查询
from django.db.models import F,Q
F 针对自己单表中字段的比较和处理
models.Book.objects.filter(good__gt=F('comment'))
models.Book.objects.all().update(price=F('price')+100)
Q 与& 或| 非~
filter(Q(xx=11)|Q(ss=22)&Q(oo=33))
filter(Q(Q(xx=11)|Q(ss=22))&Q(oo=33)) #&优先级高,先执行后面的&运算,再执行前面的|运算
filter(Q(Q(xx=11)|Q(ss=22))&Q(oo=33),name='dd') #逗号(,)隔开的话,优先级是先执行完前面的或(|),再执行逗号(,)后面的and关系
4.执行原生sql(了解)
方式一:只能对本表进行原生sql操作
1.models.Publish.objects.raw('原生sql')
#<RawQuerySet: select * from app01_publish;>
代码示例:
def test(request):
ret = models.Publish.objects.raw('select * from app01_publish;')
for i in ret:
print(i)
return HttpResponse('Test is completed')
方式二:对所有的表都可以进行原生sql操作
2.from django.db import connection
cursor = connection.cursor()
cursor.execute(sql,[1,])
cursor.fetchall()
代码示例:
from django.db import connection
cursor = connection.cursor()
cursor.execute('select * from app01_publish;')
print(cursor.fetchall())
return HttpResponse('Test is completed')
5.展示sql的
显示orm语句转换成的原生sql语句
models.Book.objects.filter(good__gt=F('comment')*2)
from django.db import connection
print(connection.queries)
6.设置 sql_mode
1.查看当前会话的sql_mode:
select @@sql_mode
2.设置当前会话的sql_mode:
set @@sql_mode = 'only_full_group_by';
3.设置全局会话的sql_mode:
set global sql_mode = 'only_full_group_by';
4.在配置文件中修改
以上是关于Django框架08 /聚合查询分组F查询和Q查询执行原生sql设置 sql_mode的主要内容,如果未能解决你的问题,请参考以下文章
python 之 Django框架(orm单表查询orm多表查询聚合查询分组查询F查询 Q查询事务Django ORM执行原生SQL)
$Django 聚合函数分组查询F,Q查询orm字段以及参数
Django之ORM跨表操作(聚合查询,分组查询,F和Q查询等)