首先,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的行为?
答案 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。