我有一个类似Foo.objects.extra(select={'extra_column':'SELECT ...'})
的查询,我希望对extra_column
进行过滤,但我无法在过滤器上获取此别名。我正在考虑使用annotate()
,但我不知道annotate()
可以使用select
子句,所有教程都在SUM
等。我也试过{ {1}}条款,但似乎Django不支持HAVING
上的HAVING
。
任何建议都将非常感谢。
编辑:
Django 1.6,MySQL
我在一些复杂的条件下查询,所以我必须使用extra()
来编写子查询。但我不能使用extra()
来访问子查询的别名。如果我转向filter()
,可以在以后annotate()
中访问,但似乎它只适用于filter()
,因此我无法在我的自定义SUM, MAX, MIN, AVG
子查询中使用它。
我在这里阅读了类似的问题:Django ORM: Filter by extra attribute。它说当查询MySQL的别名时,你需要使用SELECT
子句。
我不知道这个问题是否也出现在PostgreSQL等其他SQL后端或更高版本的Django上。也许在MySQL的Django1.6中没有关于这个问题的内置解决方案?
答案 0 :(得分:1)
作为类似问题的正确标记答案,提及;无法使用过滤器(因为filter()
仅检查模型定义)。它建议使用另一个extra
,其中包含where子句。
就像这样;
Foo.objects\
.extra(select={'extra_column':'SELECT ...'})\
.extra(where=["extra_column = %s"], params=[value])
从Django 1.7开始,您可以使用查找:
https://docs.djangoproject.com/en/1.7/howto/custom-lookups/