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)

 

posted @   朱饱饱  阅读(25)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
点击右上角即可分享
微信分享提示