如何使用子查询 django ORM?
Posted
技术标签:
【中文标题】如何使用子查询 django ORM?【英文标题】:How to django ORM with a subquery? 【发布时间】:2013-01-10 03:05:54 【问题描述】:sql子查询是:
SELECT *
FROM ( SELECT *
FROM article
ORDER BY Fid desc
LIMIT 0, 200
) as l
WHERE keyId = 1
AND typeId = 0
我试过了:
rets = Article.objects.order_by("-Fid").values('Fid')
kwargs['keyId'] = 1
kwargs['typeId'] = 0
re = Article.objects.filter(Fid__in=rets).filter(**kwargs).values()
但它不起作用。谁能解释我如何做到这一点?
【问题讨论】:
***.com/questions/8556297/… 是子查询的一个例子,但是没有模型定义和预期的输出,我真的不能确定为什么它不适合你。 @FrancisYaconiello:也许他甚至不需要子查询(似乎结果与将内部查询条件/修饰符移动到外部查询相同)。 @Paulo 这就是我想知道的。但是没有看到模型/模式和预期结果,我很难提出查询建议。 ***.com/questions/8556297/… 【参考方案1】:在你的情况下,我猜你可以resort to raw SQL(未经测试)。请注意,使用原始 SQL 您必须知道真实的表名和列名(只需先直接在数据库上测试该语句,看看它是否有效)。
例如:
Article.objects.raw("""SELECT * from (
SELECT * FROM yourapp_article
ORDER BY fid DESC
LIMIT 0, 200
) AS q1 WHERE key_id=1 AND type_id=0""")
[更新]
我写的:
感谢您的帮助。但原始 SQL 不是我想要的。我需要保持我的程序 orm 风格。 – 呜呜
如果您习惯了更强大/一致的 ORM,例如 SQLAlchemy 甚至 peewee,请放弃希望。 Django ORM 的设计非常残缺,AFAIK 你不能用它来做这种事情——这个答案的第一个版本是从对此的咆哮开始的。
再次查看您的查询,我的印象是您不需要子查询,请尝试直接查询表 - 我猜结果会一样。
【讨论】:
感谢您的帮助。但原始 SQL 不是我想要的。我需要保持我的程序 orm 风格。 原始 SQL 不是 OP 所要求的。另外,为什么 Django ORM 很烂?恕我直言,这不是一个好的答案。首先你没有回答最初的问题,然后你在没有任何证据的情况下判断它与问题没有直接关系。 @amb:Django ORM 做出了一个设计决定,以简化一些常见的用例以换取表现力。如果与 SQLAlchemy 等替代方案相比,它显然是劣等的。 AFAIK 没有办法在不使用原始 SQL 的情况下使用 Django ORM 来实现 OP 想要的。您有权投反对票,但我敢让您提出更好的答案。【参考方案2】:这个怎么样?
rets = Article.objects.order_by("-Fid").values_list('Fid', flat=True)
kwargs['keyId'] = 1
kwargs['typeId'] = 0
re = Article.objects.filter(Fid__in=rets).filter(**kwargs).values()
【讨论】:
以上是关于如何使用子查询 django ORM?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 django ORM 的 From 子句中编写子查询