F查询和Q查询
F查询
像之前我们所了解的一些过滤的例子和操作都是在针对字段值和某一个常量之间作比较,但是如果我们要针对两个字段值作比较的话就不行了,这就涉及到这个F查询了
我们可以使用Django为我们提供的F()来做一些这样的比较。F()的实例可以在查询当中引用字段,来比较同一个model实例中两个不同的字段值
首先要先导入F:
from django.db.models import F
示例:
# 查询出卖出数大于库存数的商品 # ret = models.Product.objects.filter(maichu__gt=F("kucun")) # print(ret) # 将每个商品的价格提高50块 # models.Product.objects.update(price=F("price")+50)
修改Char字段的方法
首先先导入:
from django.db.models.functions import Concat from django.db.models import Value
示例
# 将所有商品的名称后面加一个 '新款' # models.Product.objects.update(name=Concat(F("name"), Value("新款")))
Q查询
filter() 等方法中的关键字参数查询都是一起进行“AND” 的。 如果你需要执行更复杂的查询(例如OR语句),你可以使用Q对象。
首先先导入Q:
from django.db.models import Q
可以组合& 和| 操作符以及使用括号进行分组来编写任意复杂的Q 对象。同时,Q 对象可以使用~ 操作符取反,这允许组合正常的查询和取反(NOT) 查询。
示例1:
# 查询 卖出数大于100 或者 价格小于100块的 # ret = models.Product.objects.filter(Q(maichu__gt=100)|Q(price__lt=100)) # print(ret)
示例2:
# 查询 库存数是100 并且 卖出数不是0 的产品 # ret = models.Product.objects.filter(Q(kucun=100) & ~Q(maichu=0)) # print(ret)
查询函数可以混合使用Q 对象和关键字参数。所有提供给查询函数的参数(关键字参数或Q 对象)都将"AND”在一起。但是,如果出现Q 对象,它必须位于所有关键字参数的前面。
示例:
# 查询产品名包含新款, 并且库存数大于60的 # ret = models.Product.objects.filter(Q(kucun__gt=60), name__contains="新款") # print(ret)