【问题标题】:How to django ORM with a subquery?如何使用子查询 django ORM?
【发布时间】: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()

但它不起作用。谁能解释我如何做到这一点?

【问题讨论】:

  • stackoverflow.com/questions/8556297/… 是子查询的一个例子,但是没有模型定义和预期的输出,我真的不能确定为什么它不适合你。
  • @FrancisYaconiello:也许他甚至不需要子查询(似乎结果与将内部查询条件/修饰符移动到外部查询相同)。
  • @Paulo 这就是我想知道的。但是没有看到模型/模式和预期结果,我很难提出查询建议。

标签: django orm subquery


【解决方案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()

【讨论】:

    猜你喜欢
    • 2018-08-03
    • 2019-08-16
    • 2020-05-26
    • 2014-05-19
    • 2022-01-21
    • 2015-01-23
    • 1970-01-01
    • 2018-08-26
    • 1970-01-01
    相关资源
    最近更新 更多