【问题标题】:Django ORM: AND'ing and exclude queryDjango ORM:与和排除查询
【发布时间】:2015-10-29 18:38:21
【问题描述】:

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

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

我认为这些应该通过消除所有 vals 为 0 的项目来实现:

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

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

如何编写查询?谢谢。

【问题讨论】:

    标签: django-queryset django-orm


    【解决方案1】:

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

    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 运算符应该可以满足您的需求。

    【讨论】:

    • 但这只会返回allvals大于0的项目。我想要至少有2个vals大于0的项目。跨度>
    • 我之前没有看到,所以我添加了一个不同的查询来处理它。
    • 在问题中我还提到我不想做 OR 组合,因为这些值实际上超过 3,但是是的,这是我最后的手段。谢谢:)
    • 啊,是的,我现在明白了。我不知道该怎么做。您也许可以找到一种方法来使用 for 循环和正则表达式来匹配值名称来生成查询。
    猜你喜欢
    • 2014-10-25
    • 2020-12-03
    • 2020-07-01
    • 2013-09-26
    • 2014-06-13
    • 2021-07-25
    • 1970-01-01
    • 2010-12-29
    相关资源
    最近更新 更多