F和Q查询
F查询:取出数据库的某个字段的值
# 把read_num都加1 from django.db.models import F ret=models.Book.objects.all().update(read_num=F('read_num')+1) print(ret) #查询评论数大于阅读数的书籍 ret=models.Book.objects.all().filter(commit_num__gt=F('read_num')) for i in ret: print(i.name) ## 查询评论数大于阅读数2倍的书籍 ret=models.Book.objects.filter(commit_num__gt=F('read_num')*2) print(ret)
#将所有书的名称后面加上爆款两个字
在操作字符类型的数据的时候 F 不能够直接做到字符串的拼接
from django.db.models.functions import Concat
from django.db.models import Value
models.Book.objects.update(title=Concat(F('title'),value('爆款'))
# Q查询:制造 与或非的条件
# Q查询:制造 与或非的条件
Q的对象可以使用& 和| 操作符组合起来,&等同于and,|等同于or
# 查询名字叫egon或者价格大于100的书
from django.db.models import Q # ret=models.Book.objects.filter(Q(name='egon') | Q(price__gt=100)) # 查询名字叫egon并且价格大于100的书 # ret=models.Book.objects.filter(Q(name='egon') & Q(price__gt=100)) # ret=models.Book.objects.filter(name='egon',price__gt=100) # 查询名字不为egon的书 # ret = models.Book.objects.filter(~Q(name='egon')) # print(ret) # Q可以嵌套 ret = models.Book.objects.filter((Q(name='egon') & Q(price__lt=100)) | Q(id__lt=3)) print(ret)
Q 对象可以使用~ 操作符取反,相当于NOT
from django.db.models import Q
Employee.objects.filter(~Q(id__gt=5) | Q(name="Egon"))
# 等同于sql:select * from app01_employee where not (id < 5) or name = 'Egon';
当我们的过滤条件中既有or又有and,则需要混用Q对象与关键字参数,但Q 对象必须位于所有关键字参数的前面
from django.db.models import Q
Employee.objects.filter(Q(id__gt=5) | Q(name="Egon"),salary__lt=100)
# 等同于sql:select * from app01_employee where (id < 5 or name = 'Egon') and salary < 100;
Q的高阶用法 能够查询条件的左边也变成字符串的形式,客户端自行输入查询条件
q=Q() q.connector='or' #使用or 默认是and q.children.append(('maichu__gt',100)) q.children.append(('price__lt',600)) res=models.objects.filter(q) print(res)
浙公网安备 33010602011771号