2

首先,Django 添加了不必要的引号,这会导致 PostgreSQL 语法错误:

Model.objects.extra(tables=['(SELECT ... FROM model) AS "model_alias"'],
                    where=...)

生产

SELECT ... FROM "model" , "(SELECT ...) AS "model_alias"" WHERE ...

-- 语法错误,在哪里

SELECT ... FROM "model" , (SELECT ...) AS "model_alias" WHERE ...

没关系。

tables其次,它忽略了方法参数中额外出现的表名extra,而文档承诺应该创建别名:

Model.objects.extra(tables=['model'], where=...)

只产生SELECT ... FROM "model" WHERE ...-- 没有别名。

错误在哪里?如何克服这种 Django 的行为?

4

3 回答 3

1

您可能需要使用原始 SQL 来执行此操作。请参阅执行原始 SQL 查询。它可能看起来像这样:

Model.objects.raw("""
    SELECT * FROM 'model' JOIN 'model_alias' ON (...) 
    WHERE (...)
""")
于 2012-07-23T17:45:22.963 回答
0

首先,你试过这个吗?

Model.objects.extra(tables=["(SELECT ... FROM model) AS 'model_alias'"],
                    where=...)

我没有使用过objects.extra,但我认为这应该可行。我不知道第二个,但请确保您已阅读 where/tables 的所有文档。

于 2012-07-23T17:42:58.843 回答
0

Extra 是一种将字段附加到查询集的方法,它不适用于子查询。您将不得不使用Django 的聚合系统

于 2012-07-23T17:43:17.963 回答