如何在Django过滤器中使用AND?

gat*_*ath 55 python django

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

例如,当我在mysql数据库上运行它时,以下SQL查询就是这样做的:

select * from myapp_question
where ((question like '%software%') and (question like '%java%'))
Run Code Online (Sandbox Code Playgroud)

你如何使用过滤器在Django中实现这一目标?

Dav*_*ger 98

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

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

请注意,这里的其他答案更简单,更适合您的用例,但如果有任何类似但稍微复杂的问题(例如需要"不"或"或")看到这一点,那么最好在此处引用该引用.

  • 只是想提一下你的传球评论对我有帮助.谢谢! (3认同)

And*_*sio 82

mymodel.objects.filter(first_name__icontains="Foo", first_name__icontains="Bar")
Run Code Online (Sandbox Code Playgroud)

更新:很长一段时间以来我写了这个答案并完成了一些django,但我相信最好的方法是使用像David Berger这样的Q对象方法:如何在Django过滤器中使用AND?

  • 请注意,两个字段都相同!这是python本身不允许这样,它不会在任何django/db中工作.这不应该是一个公认的答案. (5认同)
  • 这在Django 1.6和Postgres中对我不起作用.每当有两个或更多相同的关键字时,我会得到一个"SyntaxError:关键字参数重复".只有David Berger的Q解决方案才有效. (4认同)

mip*_*adi 8

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

q = Question.objects.filter(question__contains='software').filter(question__contains='java')
Run Code Online (Sandbox Code Playgroud)

您可以在" 链接过滤器 " 中的Django文档中找到更多信息.

  • 根据您的情况,此答案可能会给您错误的结果.在过滤器与链接过滤器中使用`,`可能会有不同的结果.进一步阅读:[SO答案](http://stackoverflow.com/a/11025652/781695)和[官方文档](https://docs.djangoproject.com/en/dev/topics/db/queries/#spanning - 多值-关系) (7认同)
  • @mohammed_ayaz 该问题要求进行 AND 运算,而不是 OR 运算。 (2认同)