如何正确地创建一个Django QuerySet,其中某个字段在列表中有值?

时间:2012-01-16 02:51:42

标签: django django-queryset django-database

我有一堆Widget对象。

现在每个小部件都有一个名为'foo'的字符串属性。我需要能够查询将'foo'设置为'red','orange','green'或任意颜色的Widgets,并且只包含具有适当'foo'属性的Widgets。此外,这些颜色来自用户输入,所以我不能相信它们。我宁愿不加载所有结果然后过滤它们,而是在SQL中执行此操作。

然而......我只看到用“AND”加入子句的方法,从不“OR”。并且“in”是垃圾('in'仅适用于数字ID,或子查询集,它可以减少到相同的问题!)。我尝试了其他一些东西,但它们似乎没有用。

基本上,我问如何将其表达为filterQuery下面的关键字。

myNiceWidgets = Widget.objects.filter(**filterQuery).orderBy(...)

感谢。

3 个答案:

答案 0 :(得分:3)

要使用OR,请查看django的Q个对象。

https://docs.djangoproject.com/en/dev/topics/db/queries/#complex-lookups-with-q-objects

Widget.objects.filter(Q(foo='red') | Q(foo='green'), **filterQuery)

它不能作为filterQuery的键,因为Q对象必须是位置参数。

  

查找函数可以混合使用Q对象和关键字参数。   提供给查找函数的所有参数(可以是关键字参数)   或者Q对象)被“和”在一起。但是,如果是Q对象   如果提供,它必须在任何关键字参数的定义之前。对于   例如:

答案 1 :(得分:2)

此:

  

'in'仅适用于数字ID或子查询集

是胡说八道。 in可以使用名单列表:

Widget.objects.filter(foo__in=['red', 'orange', 'green', 'blue'])

答案 2 :(得分:0)

感谢您的回答!

我还结束了在列表理解中做了几个子查询,然后抓取这些ID并使用in。它(希望)值得,因为我在请求的后期再次使用了中间对象。