11 Django F与Q查询
一、F与Q查询
from django.db.models import F, Q
二、F 查询
在上面所有的例子中,我们构造的过滤器都只是将字段值与某个我们自己设定的常量做比较。如果我们要对两个字段的值做比较,那该怎么做呢?
Django 提供 F() 来做这样的比较。F() 的实例可以在查询中引用字段,来比较同一个 model 实例中两个不同字段的值。
# 1.查询出卖出数大于库存数的商品
res = models.BookRecord.objects.filter(maichu__gt=F("kucun")).first()
print(res.book.name)
'''*******************************************注意
F可以帮我们取到表中某个字段对应的值来当作我的筛选条件,而不是我认为自定义常量的条件了,实现了动态比较的效果
Django 支持 F() 对象之间以及 F() 对象和常数之间的加减乘除和取模的操作。基于此可以对表中的数值类型进行数学运算
'''********************************************注意
# 2.将所有的书的价格 全部提高100块
res = models.Book.objects.update(price = F("price")+100)
# 3.了解 尝试着将所有的书的名字后面都加上 爆款
from django.db.models.functions import Concat
res = models.Book.objects.update( name=Concat(F("name"),Value("(爆款)")) )
Concat表示进行字符串的拼接操作,参数位置决定了拼接是在头部拼接还是尾部拼接,Value里面是要新增的拼接值
三、Q 查询
filter()
等方法中逗号隔开的条件是与的关系。 如果你需要执行更复杂的查询(例如OR
语句),你可以使用Q对象
中的|,非的查询时Q查询中的~ 破浪号。
示例:
1.查询 卖出数大于100 或者 价格小于100块的
from django.db.models import Q
models.Product.objects.filter(Q(maichu__gt=100)|Q(price__lt=100))
2.查询 库存数是100 并且 卖出数不是0 的产品
models.Product.objects.filter(Q(kucun=100)&~Q(maichu=0))
3.查询产品名包含新款, 并且库存数大于60的
models.Product.objects.filter(Q(kucun__gt=60), name__contains="新款")
注意:我们可以组合& 和| 操作符以及使用括号进行分组来编写任意复杂的Q 对象。
同时,Q 对象可以使用~ 操作符取反,这允许组合正常的查询和取反(NOT) 查询。
# Q查询进阶用法 用Q产生对象 然后再使用
q=Q()
# 这里设置此Q查询用的是or方法,默认是and方法
q.connector="or"
# 这是是Q查询括号内的条件
q.children.append(("name__contains", 'python'))
# filter括号内是Q查询q
res = models.Book.objects.filter(q)
print(res)