嘻哈飞车族|Django之ORM表高级操作、增删改查、F/Q查询等( 五 )

3.聚合查询需要使用到:aggregate关键字from django.db.models import Max,Min,Avg,Count,Sum# 导入模块res = models.Book.objects.aggregate(avg_num=Avg('price'))print(res)# 查询价格最贵的书res = models.Book.objects.aggregate(max_num=Max('price'))print(res)# 全部使用一遍res = models.Book.objects.aggregate(Avg("price"), Max("price"), Min("price"),Count("pk"),Sum('price'))print(res)4.分组查询需要使用到:annotate关键字# 1.统计每一本书的作者个数res = models.Book.objects.annotate(author_num=Count('authors')).values('title','author_num')print(res)# 2.统计出每个出版社卖的最便宜的书的价格res = models.Publish.objects.annotate(min_price=Min('book__price')).values('name','min_price','book__title')print(res)# 3.统计不止一个作者的图书res = models.Book.objects.annotate(author_num=Count('authors')).filter(author_num__gt=1).values('title')print(res)# 4.查询各个作者出的书的总价格res = models.Author.objects.annotate(price_sum=Sum('book__price')).values('name','price_sum')print(res)如何按照表中的某一个指定字段分组?
res = models.Book.objects.values('price').annotate()就是以价格分组5.F查询在上面所有的例子中 , 我们构造的过滤器都只是将字段值与某个我们自己设定的常量做比较 。 如果我们要对两个字段的值做比较 , 那该怎么做呢?
Django 提供 F() 来做这样的比较 。 F() 的实例可以在查询中引用字段 , 来比较同一个 model 实例中两个不同字段的值 。
简而言之:F()查询可以动态获取表字段对应的值
需要导入模块:from django.db.models import F,Q
案例:
# 1.查询库存数大于卖出数的书籍res = models.Book.objects.filter(kucun__gt=F('maichu'))print(res)# 2.将所有书的价格提高100res = models.Book.objects.update(price=F('price') + 100)6.Q查询','逗号隔开是and关系'|'管道符是or的关系'~'是not关系filter() 等方法中逗号隔开的条件是与的关系 。如果你需要执行更复杂的查询(例如OR语句) , 你可以使用Q对象 。
示例1:
查询 卖出数大于100 或者 价格小于100块的
from django.db.models import Qmodels.Product.objects.filter(Q(maichu__gt=100)|Q(price__lt=100))# 1.查询书的名字是python入门或者价格是1000的书籍res = models.Book.objects.filter(title='python入门',price=1000)# and关系res = models.Book.objects.filter(Q(title='python入门'),Q(price=1000))# 逗号是and关系res = models.Book.objects.filter(Q(title='python入门')|Q(price=1000))# |是or关系res = models.Book.objects.filter(~Q(title='python入门')|Q(price=1000))# ~是not关系7.Q的高阶用法res = models.Book.objects.filter('title'='python入门')q = Q()q.connector = 'or'# q对象默认也是and关系可以通过connector改变orq.children.append(('title','python入门'))q.children.append(('price',1000))res = models.Book.objects.filter(q)print(res)选择了IT , 必定终身学习
作者:Jeff
【嘻哈飞车族|Django之ORM表高级操作、增删改查、F/Q查询等】出处: