使用 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
异常。