Django ORM:AND'ing和排除查询

时间:2015-10-29 18:38:22

标签: django-queryset django-orm

我想选择多个值大于0的项目。

class Item(models.Model):
    val1 = models.PositiveIntegerField()
    val2 = models.PositiveIntegerField()
    val3 = models.PositiveIntegerField()

我认为这可以通过消除所有val为0的项目来实现:

Item.objects.exclude(val1=0, val2=0, val3=0)
Item.objects.exclude(Q(val1=0) & Q(val2=0) & Q(val3=0))

它们都消除了val为零的每个项目,并且仅返回所有val s大于0的项目。我不想OR组合但是找到一个通用表达式,因为val s可以大于3.

如何编写查询?感谢。

1 个答案:

答案 0 :(得分:0)

您可以使用链接过滤器执行此操作:

Item.objects.filter(val1__gt=0).filter(val2__gt=0).filter(val3__gt=0)

使用过滤器__gt仅选择大于该值的值。链接过滤器充当逻辑AND语句,因此这将排除所有三个值为0的任何值。

编辑:

根据您的评论澄清您的实际需求,这样的事情可能有用。 (未经测试)

Item.objects.filter((Q(val1__gt=0) & Q(val2__gt=0)) |
                    (Q(val2__gt=0) & Q(val3__gt=0)) | 
                    (Q(val1__gt=0) & Q(val3__gt=0)))

以正确的顺序绑定多个ANDOR运算符可以满足您的需求。