Django:如何过滤额外的列?

时间:2014-12-22 09:56:28

标签: django django-orm

我有一个类似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中没有关于这个问题的内置解决方案?

1 个答案:

答案 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/