0

我有一堆 Widget 对象。

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

但是……我只看到用“AND”连接子句的方法,从来没有“OR”。并且“in”是垃圾(“in”仅适用于数字 ID 或子查询集,这会减少相同的问题!)。我尝试了其他一些东西,但它们似乎不起作用。

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

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

谢谢。

4

3 回答 3

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)

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

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

于 2012-01-16T03:06:25.120 回答
2

这:

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

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

Widget.objects.filter(foo__in=['red', 'orange', 'green', 'blue'])
于 2012-01-16T07:14:15.520 回答
0

感谢您的回答!

我还结束了在列表理解中执行一些子查询,然后获取这些 ID 并使用in. 这(希望)是值得的,因为我稍后在请求中再次使用了中间对象。

于 2012-01-16T18:58:30.173 回答