django F查询和Q查询

F 对象:用于引用模型字段自身的值

F 对象允许你在数据库层面进行字段之间的比较或运算,而不是将值取出到 Python 中再处理。

from django.db.models import F
MyModel.objects.update(counter=F('counter') + 1) #将某个字段加 1 所有counter+1
MyModel.objects.filter(sales__gt=F('inventory')) #比较两个字段
Entry.objects.filter(number_of_comments__gt=F("number_of_pingbacks"))#找到所有具有比 pingback 更多评论的博客条目的列表
Entry.objects.filter(number_of_comments__gt=F("number_of_pingbacks") * 2)# 要查找所有具有评论数超过 pingback 两倍的博客条目
Entry.objects.filter(rating__lt=F("number_of_comments") + F("number_of_pingbacks"))#要查找所有评分低于评论数和 pingback 数的总和的条目
Entry.objects.filter(authors__name=F("blog__name"))#要检索所有作者名称与博客名称相同的条目
Entry.objects.filter(mod_date__gt=F("pub_date") + timedelta(days=3))# 所有在发布后超过3天修改的条目
Entry.objects.filter(pub_date__year=F("mod_date__year"))#要找到所有与它们上次修改的年份相同的 Entry 对象

 

 

Q 对象:用于构建复杂的查询条件(支持逻辑运算)

Q 对象允许你使用 逻辑与(&)、或(|)、非(~ 来组合多个查询条件。

from django.db.models import Q

MyModel.objects.filter(Q(name='Alice') | Q(age__lt=30)) #查询 name 为 "Alice" 或 age 小于 30 的记录

MyModel.objects.filter(Q(name='Bob') & ~Q(is_admin=True)) #查询 name 为 "Bob" 且不是管理员

F 和 Q 结合使用

你可以将 F 对象嵌入到 Q 中,构建更复杂的查询。

from django.db.models import Q, F

 

MyModel.objects.filter(Q(sales__gt=F('inventory')))#查询销售额大于库存的记录

Product.objects.filter(Q(stock__lt=F('min_stock')) | Q(sales__gt=F('stock'))) #查询库存小于最小库存阈值,或者销量大于库存的商

posted @ 2025-08-21 09:43  我的腹肌不见了  阅读(10)  评论(0)    收藏  举报