用django自己加入postgresql

时间:2012-07-23 17:09:57

标签: python django postgresql django-queryset django-1.4

首先,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参数中表名的额外出现,而the documentation承诺应该创建别名:

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

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

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

3 个答案:

答案 0 :(得分:1)

您可能需要使用原始SQL来执行此操作。见Performing raw SQL queries。它可能看起来像这样:

Model.objects.raw("""
    SELECT * FROM 'model' JOIN 'model_alias' ON (...) 
    WHERE (...)
""")

答案 1 :(得分:0)

首先,你试过这个吗?

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

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

答案 2 :(得分:0)

Extra是一种将字段附加到查询集的方法,它不适用于子查询。您将不得不使用Django's aggregation system