1、特殊查询
F和Q查询:
之前的查询都是模型对象的属性与常量值比较,两个属性怎么比较呢?使用F查询。
F查询语法:
from django.db.models import F F('属性名称')
F查询要求
# 1.查询id大于价格的书籍 # 2.查询价格大于2倍id的书籍
1.查询id大于价格的书籍
book = Books.objects.all() book1 = book.filter(id__gt=F("price")) print(book1)
2.查询价格大于2倍id的书籍
book = Books.objects.all() book1 = book.filter(price__gt=F("id")*2) print(book1)
3、查询价格大于52,并且author_id小于3的图书
book = Books.objects.all() book1 = book.filter(price__gt=52,author_id__lt=3) print(book1)
book1 = book.filter(price__gt=52).filter(author_id__lt=3)
Q查询
Q查询语法:
from django.db models import Q Q(模型属性1_条件运算符=值)|Q(模型属性2_条件运算符=值) #(~非)
# 1.查询价格大于20,或id小于3的图书 # 2.查询id不等于3的书籍
1.查询价格大于20,或id小于3的图书
book = Books.objects.all() book1 = book.filter(Q(price__gt=52)|Q(id__lt=3)) print(book1)
2.查询id不等于3的书籍(Q对象可以使用~非还有|或)
book = Books.objects.all() book1 = book.filter(~Q(id=3)) print(book1)
聚合函数
使用aggregate()过滤器调用聚合函数,返回特定的对象。聚合函数包括Avg,Max,Min,Sum,Count(使用Count时,一般不需要aggregate()过滤器,直接调用即可),聚合函数被定义在django.db.models中。
1、统计总的价格数
book = Books.objects.all() price_sum = book.aggregate(Sum("price")) print(price_sum)
关联查询
基础关联查询
# 1.查询id为1的作者出版的书籍信息 # 2.查询id为2的书籍的作者信息
1.查询id为1的作者出版的书籍信息
author = Authors.objects.get(pk=1) #书籍的外键是作者,因此先查询到pk=1的作者,然后再查书籍 #由于书与作者是多对一,当由一去找多的时候, # 需要将多的类名小写在加_set在加上全部的 book = author.books_set.all() print(book)
2.查询id为2的书籍的作者信息
#先查出pk=2的这本书籍,再去查对应的作者 book = Books.objects.get(pk=2) #查对应的作者 由于是多对一查找,直接点外键名就可以查出相关信息 auth = book.author print(auth)
总结:当书籍的外键是作者的时候,
查询规则:
多查一:(将书本查出来:直接将对象点外键对象就可以查出来)
一查多:(将作者查出来:直接将作者对象点关联模型类类名小写加_set即可查出)
内连接查询(inner join)
语法:
filter(关联模型类类名小写__属性名__运算符=值) #例:filter(books__name="与时间做朋友")
需求:
# 1.查询作者为"何帆"的所有书籍信息 # 2.查询作者的书籍中描述包含"时间"的作者
1.查询作者为"何帆"的所有书籍信息
#1.查询作者为"何帆"的所有书籍信息 #01第一步我们可以先查书在过滤作者,由于是多找一,直接外键对象名加__属性名=“” auth = Books.objects.filter(author__name="何帆") print(auth)
2.查询作者的书籍中描述包含"时间"的作者
#2.查询作者的书籍中描述包含"时间"的作者 #先查询所有作者,在过滤出来关联书籍包含“时间”的信息 #查询作者过滤书籍出来,是少查多,过滤规则是类模型名小写__属性名__条件名=“时间” auth = Authors.objects.filter(books__name__contains="时间") print(auth)
总结关联查询:
当查询多过滤少的时候filter(外键对象名__属性名__条件=“”)
当查询少过滤条件是多的时候filter(模型类名小写__属性名__条件=‘’)