【问题标题】:Django filter multiple valuesDjango过滤多个值
【发布时间】:2018-12-09 19:47:59
【问题描述】:

有人知道为什么这个query_set 没有为我返回任何值吗?单独使用过滤器,它工作得很好,所以看起来.filter().filter() 一起是过滤“要么”的错误方法。

ticket_query = request.event.tickets.filter(status='on-sale').filter(status='paused').prefetch_related('ticket_tax')

【问题讨论】:

标签: python django


【解决方案1】:

filter() 带有多个参数,通过 AND 语句将它们连接起来: https://docs.djangoproject.com/en/2.0/ref/models/querysets/#filter

要在 django 中执行 OR 查询,您可以使用 Q 对象:

from django.db.models import Q

ticket_query = request.event.tickets.filter(Q(status='on-sale') | Q(status='paused')).prefetch_related('ticket_tax')

更多细节在这里: https://docs.djangoproject.com/en/2.0/topics/db/queries/#complex-lookups-with-q

【讨论】:

    【解决方案2】:

    像您所做的那样链接filter 将后续过滤器应用于前一个过滤器返回的查询集,即它的作用类似于 AND 条件,而不是 OR

    您可以使用| 运算符来组合两个查询:

    ticket_query = request.event.tickets.filter(status='on-sale') | request.event.tickets.filter(status='paused')
    

    【讨论】:

      【解决方案3】:

      request.event.tickets.filter(status='on-sale') 返回所有带有status='on-sale' 的对象,并且您正在该列表中寻找带有status='paused' 的对象,这就是您得到一个空查询集的原因。

      如果它是ManyToManyField,则链接 2 个过滤器很好,您可以为同一字段拥有多个对象,或者如果您链接 2 个单独的字段,例如。 request.event.tickets.filter(status='on-sale').filter(is_available=True),返回所有在售的门票都可用。

      解决此问题的最简单方法是在过滤器中使用__in,如下所示:ticket_query = request.event.tickets.filter(status__in=['on-sale', 'paused']).prefetch_related('ticket_tax')

      希望这会有所帮助。 :)

      【讨论】:

        猜你喜欢
        • 2017-01-15
        • 1970-01-01
        • 2021-03-09
        • 2016-06-19
        • 2015-08-06
        • 2011-11-29
        • 2018-11-21
        • 2013-04-26
        • 1970-01-01
        相关资源
        最近更新 更多