使用 Q 对象进行高级查询

鉴于模型:

class MyModel(models.Model):
    name = models.CharField(max_length=10)
    model_num = models.IntegerField()
    flag = models.NullBooleanField(default=False)

我们可以使用 Q 对象在查询查询中创建 ANDOR 条件。例如,假设我们想要所有具有 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 对象可以与任何带有关键字参数的查找函数一起使用,例如 filterexcludeget。确保当你使用 get 时,你将只返回一个对象,否则会引发 MultipleObjectsReturned 异常。