我有一堆Widget对象。
现在每个小部件都有一个名为'foo'的字符串属性。我需要能够查询将'foo'设置为'red','orange','green'或任意颜色的Widgets,并且只包含具有适当'foo'属性的Widgets。此外,这些颜色来自用户输入,所以我不能相信它们。我宁愿不加载所有结果然后过滤它们,而是在SQL中执行此操作。
然而......我只看到用“AND”加入子句的方法,从不“OR”。并且“in”是垃圾('in'仅适用于数字ID,或子查询集,它可以减少到相同的问题!)。我尝试了其他一些东西,但它们似乎没有用。
基本上,我问如何将其表达为filterQuery
下面的关键字。
myNiceWidgets = Widget.objects.filter(**filterQuery).orderBy(...)
感谢。
答案 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
。它(希望)值得,因为我在请求的后期再次使用了中间对象。