【问题标题】:How do I use AND in a Django filter?如何在 Django 过滤器中使用 AND?
【发布时间】:2010-10-20 16:03:27
【问题描述】:

如何创建“AND”过滤器来检索 Django 中的对象?例如,我想检索在单个字段中包含两个单词组合的行。

例如,当我在 mysql 数据库上运行以下 SQL 查询时,它的作用完全一样:

select * from myapp_question
where ((question like '%software%') and (question like '%java%'))

您如何在 Django 中使用过滤器来实现这一点?

【问题讨论】:

    标签: python django


    【解决方案1】:

    为了彻底起见,我们只提Q对象方法:

    from django.db.models import Q
    criterion1 = Q(question__contains="software")
    criterion2 = Q(question__contains="java")
    q = Question.objects.filter(criterion1 & criterion2)
    

    请注意,此处的其他答案更简单,更适合您的用例,但如果有类似但稍微复杂的问题(例如需要“不”或“或”)的人看到这一点,最好有参考就在这里。

    【讨论】:

    【解决方案2】:

    更新:此答案将不再有效,并给出语法错误keyword argument repeated

    mymodel.objects.filter(first_name__icontains="Foo", first_name__icontains="Bar")
    

    更新:自从我写了这个答案并做了一些 django 以来很长时间了,但我确信迄今为止最好的方法是使用 Q 对象方法,就像 David Berger 在这里展示的那样:How do I use AND in a Django filter?

    【讨论】:

    • 这在 Django 1.6 和 Postgres 中对我有用。每当有两个或多个相同的关键字时,我都会收到“语法错误:关键字参数重复”。只有 David Berger 的 Q 解决方案才有效。
    • 我有一个国家代码短字段 (cc_short) 的模型国家:>>> countries = Country.objects.filter(cc_short__icontains='A', cc_short__icontains='B') File "",第 1 行语法错误:关键字参数重复
    • 这也对我也不起作用。与@margusholland 相同的错误。使用 Django 1.7.5。有问题的代码:talks = Talks.objects.filter(description__contains=topics,description__contains=terms).order_by('-datetime') 主题和术语都是列表。
    • 请注意,这两个字段是相同的!是 python 本身不允许这样做,它在任何 django/db 中都不起作用。这不应该是一个公认的答案。
    • 嘿@MayankMehtani,如果关键字参数本身不同,而不仅仅是它们的值,它应该可以工作。
    【解决方案3】:

    您可以在 Django 中链接过滤器表达式:

    q = Question.objects.filter(question__contains='software').filter(question__contains='java')
    

    您可以在“Chaining Filters”的 Django 文档中找到更多信息。

    【讨论】:

    • 根据您的情况,此答案可能会给您错误的结果。在过滤器和链接过滤器中使用, 可能会产生不同的结果。进一步阅读:SO Answer & Official docs
    • 这不是问题的答案。它将给出差异输出。但这是我一直在寻找的。 OP想要的是allobjects.filter(name = x或name = y),但这个答案将首先给出= allobjects.filter(name = x)然后filter first.filter(name = y)。希望你们能得到它。抱歉伪代码。
    • @mohammed_ayaz 该问题要求进行 AND 操作,而不是 OR 操作。
    • 我真的很好奇为什么这个回答甚至被赞成。除了这具有 OR 逻辑这一事实之外,如果过滤的字段来自引用的表,它将有不同的结果。
    • @Alexandru-MihaiManolescu:什么有 OR 逻辑?这个问题是 AND,而不是 OR。
    猜你喜欢
    • 2010-10-26
    • 1970-01-01
    • 2020-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-23
    • 1970-01-01
    相关资源
    最近更新 更多