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()
但它没有用。任何人都可以解释我怎么做到这一点?
答案 0 :(得分:2)
在你的情况下,我猜你可以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:
感谢您的帮助。但原始SQL不是我想要的。我需要保持我的程序风格。 - wuent
如果您习惯于更强大/一致的ORM,例如SQLAlchemy甚至peewee,请放弃您的希望。 Django ORM有一个非常残缺的设计和AFAIK你不能用它来做这种事情 - 这个答案的第一个版本开始时对此有一种咆哮。
再次查看您的查询,我得到的印象是您不需要子查询,请尝试直接查询表 - 我的猜测结果将是相同的。
答案 1 :(得分: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()