2009-04-20 22 views
30

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

例如,下面的SQL查询正是这么做的,当我在MySQL数据库运行:

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

如何使用过滤器,你做到这一点在Django?

回答

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

更新:因为我写了这个答案,并做了一些Django的,但我相信这天最好的办法是使用像大卫·伯格将q对象的方法很长一段时间显示在这里:stackoverflow.com/ A /63097分之770078

+3

这对Django 1.6和Postgres来说并不适合我。每当有两个或更多相同的关键字时,我会收到“重复的SyntaxError:关键字参数”。只有David Berger提出的Q解决方案才有效。 – margusholland 2014-05-30 07:32:54

+0

@margusholland答案适用于Django 1.6和Postgres。你能发布你的查询吗?它与Q对象方法一样正式。 https://docs.djangoproject.com/zh/dev/topics/db/queries/#spanning-multi-valued-relationships – Medorator 2014-07-08 19:15:12

+1

我有一个短国家代码字段(cc_short)的国家: >>>国家= Country.objects.filter(cc_short__icontains ='A',cc_short__icontains ='B') 文件“”,第1行 SyntaxError:重复的关键字参数 – margusholland 2014-07-09 08:56:10

10

你可以连续过滤器表达式在Django:

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

您可以在 “Chaining Filters” Django文档的详细信息。

57

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

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

注意这里的其他答案更简单,更好地适应你的使用情况,但如果有人有类似,但稍微复杂的问题(如需要“不”或“或”)看到这一点,这是很好的参考权利在这里。