如何使用子查询django ORM?

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()

但它不起作用.任何人都可以解释我怎么做到这一点?

最佳答案 在你的情况下,我猜你可以
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""")

[更新]

wuent wrtote:

thanks for your help. But the raw SQL is not my wanted. I need keep my program orm style. – wuent

如果你习惯了更强大/一致的ORM,如SQLAlchemy甚至peewee,那就放弃你的希望了. Django ORM有一个非常残缺的设计和AFAIK,你不能用它做这种事情 – 这个答案的第一个版本开始时对此有一种咆哮.

再次查看您的查询,我得到的印象是您不需要子查询,请尝试直接查询表 – 我的猜测结果将是相同的.

点赞