如何使用子查询 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 中执行子查询?

如何在 django ORM 的 From 子句中编写子查询

Django ORM使用子查询按关键字搜索文本

在 Django 的 ORM 中使用带有 UPDATE 的子查询

如何使用Django ORM查询计算数量乘以价格

使用Django ORM查询如何注释是不是存在多级外键层次结构