使用 Q 对象进行高级查询
鉴于模型:
class MyModel(models.Model):
name = models.CharField(max_length=10)
model_num = models.IntegerField()
flag = models.NullBooleanField(default=False)
我们可以使用 Q 对象在查询查询中创建 AND,OR 条件。例如,假设我们想要所有具有 flag=True OR model_num>15 的对象。
from django.db.models import Q
MyModel.objects.filter(Q(flag=True) | Q(model_num__gt=15))
上面翻译为 WHERE flag=True OR model_num > 15 类似于你会做的 AND 。
MyModel.objects.filter(Q(flag=True) & Q(model_num__gt=15))
Q 对象也允许我们使用~ 进行 NOT 查询。假设我们想要获得所有具有 flag=False 和 model_num!=15 的对象,我们会这样做:
MyModel.objects.filter(Q(flag=True) & ~Q(model_num=15))
如果在 filter() 中使用 Q 对象和普通参数,那么 Q 对象必须首先出现。以下查询搜索具有(flag 设置为 True 或型号大于 15)和名称以 H 开头的模型。
from django.db.models import Q
MyModel.objects.filter(Q(flag=True) | Q(model_num__gt=15), name__startswith="H")
注意: Q 对象可以与任何带有关键字参数的查找函数一起使用,例如 filter,exclude,get。确保当你使用 get 时,你将只返回一个对象,否则会引发 MultipleObjectsReturned 异常。