【问题标题】:Django: how to filter on extra column?Django:如何过滤额外的列?
【发布时间】:2015-02-20 09:50:51
【问题描述】:

我有一个类似的查询:Foo.objects.extra(select={'extra_column':'SELECT ...'}),我想过滤 extra_column,但我无法在过滤器上获取此别名。我正在考虑使用annotate(),但我不知道annotate() 可以在selectclause 上使用,所有教程都在SUM 等。我也尝试过HAVING 子句,但似乎Django 没有在extra() 上不支持HAVING

任何建议将不胜感激。

编辑:

Django 1.6,MySQL

我正在查询一些复杂的条件,所以我必须使用extra() 来编写子查询。但我不能使用filter() 访问子查询的别名。如果我转向annotate(),它可以在以后访问filter(),但似乎它只适用于SUM, MAX, MIN, AVG,因此我不能在我的自定义SELECT子查询中使用它。

我在这里读到了类似的问题:Django ORM: Filter by extra attribute。它说在MySQL上查询别名时,需要使用HAVING子句。

我不知道这个问题是否也出现在其他 SQL 后端(如 PostgreSQL)或更高版本的 Django 上。可能Django1.6 with MySQL没有内置解决这个问题的办法?

【问题讨论】:

  • 你能解释一下你想用额外的查询做什么吗?也许它可以通过连接甚至简单的注释来解决。另外,您使用的是哪个 Django 版本?
  • @Blackeagle52 已更新。

标签: django django-orm


【解决方案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/

【讨论】:

  • 其实extra会在SQL中渲染where子句。但是在 MySQL 中,你需要 HAVING 在这里。所以我最终使用了原始 SQL。
  • 这个例子不起作用。它在 MySQL 数据库上引发 OperationalError: (1054, "Unknown column 'extra_column' in 'where clause'")。您不能在另一个 extra 子句中使用使用 extra 生成的字段。
猜你喜欢
  • 2011-05-19
  • 2015-04-03
  • 1970-01-01
  • 2020-08-23
  • 2010-12-01
  • 2019-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多