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 は私の望みではありません。プログラムまたはスタイルを維持する必要があります。– ウエント

SQLAlchemypeeweeなどのより強力で一貫性のある ORM に慣れている場合は、希望をあきらめてください。Django ORMの設計は非常に不自由であり、知る限り、それを使用してこの種のことを行うことはできません-この回答の最初のバージョンは、これについての暴言から始まりました。

クエリをもう一度見てみると、サブクエリは必要ないという印象を受けました。テーブルを直接クエリしてみてください。結果は同じになると思います。

于 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 に答える