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

91 投票
4 回答
110459 浏览
提问于 2025-04-15 11:11

我该如何在Django中创建一个“与”过滤器,以便获取对象?比如说,我想获取一行数据,这一行的某个字段里同时包含两个词。

例如,当我在mysql数据库上运行以下SQL查询时,它正好能做到这一点:

SELECT * FROM myapp_question
WHERE ((question LIKE '%software%') AND (question LIKE '%java%'))

那么在Django中,如何使用过滤器来实现这个呢?

4 个回答

18

在Django中,你可以把多个筛选条件连在一起使用:

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

想了解更多信息,可以查看Django的文档,链接是“连接筛选条件”。

172

为了全面起见,我们提一下Q对象的方法:

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

请注意,这里其他的回答更简单,也更适合你的情况,但如果有其他人遇到类似但稍微复杂一点的问题(比如需要用到“不是”或者“或者”),那么在这里提到这个方法也是很有帮助的。

113

(更新: 这个答案现在已经不适用了,会出现语法错误 keyword argument repeated)

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

更新: 自从我写这个答案以来已经过了很长时间,我也做了一些 Django 的项目,但我相信到现在为止,最好的方法是使用 Q 对象的方法,就像 David Berger 在这里展示的那样: 我该如何在 Django 过滤器中使用 AND?

撰写回答