4

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

但它不起作用。谁能解释我该怎么做?

4

2 回答 2

2

在您的情况下,我想您可以使用原始 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 写道:

谢谢你的帮助。但原始 SQL 不是我想要的。我需要保持我的程序 orm 风格。– 呜呜

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

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

于 2013-01-10T04:10:52.423 回答
0

这个怎么样?

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()
于 2015-06-10T07:48:57.387 回答