2012-01-20 19 views
0

PostgreSQLにDjangoに翻訳したいSQLクエリがあります。このSQLクエリをDjangoに変換するにはどうすればよいですか?

select * from main_document 
where id in (
    select distinct on (document_id) document_id 
    from main_tokenindex 
    where token in('token1', 'token2') 
    order by document_id, relevance desc 
) LIMIT 100 

私は2つのテーブル:ドキュメントとトークンインデックスを持っています。 1から多くの関係まで、トークンは多くの文書に存在する可能性があります。

私はこれまでのところ、これを持っている:あなたが見ることができるように

terms = [] 
ids = [doc.document_id for doc in TokenIndex.objects.filter(token__in = terms). 
     distinct('document__id').order_by("-relevance")] 

list(Document.objects.filter(pk__in=ids))[:max_res] 

が、問題は、私はIDのリストを取得するには、データベースに行き、その後、文書を取得するために戻って再びつもりだということです。私は小さなサブセット(max_res変数で定義され、SQLではLIMITで定義されています)

SQLクエリをDjangoに変換するにはどうすればよいですか?これは数百万のドキュメントIDを処理する可能性があるため非効率です。 ?私は、Djangoのクエリは、私はそれだけで例えば100の文書やない1.000.000文書ID、その後、100の文書を返すという意味で、手で書いたもののようになりたい。

答えて

2
result = Document.objects.filter(pk__in=(TokenIndex.objects.filter(token__in=terms).distinct('document').order_by('document', '-relevance').values_list('document', flat=True)[:max_res])) 

そうでない場合は1.000.000の文書IDが必要です.100を返すだけです。内側のクエリではLIMIT、外側のクエリでは

が必要です。 10

とにかく、あなたが外側のクエリでLIMITを使用していても、あなたが望むSQLに変換すると思います。

+0

回答ありがとうございますが、それは私を助けません。 SQLクエリでは、100個のドキュメントが返されます。私はすべてのIDSが必要な内部クエリを制限することはできませんし、ドキュメントを取得します。 djangoでraw SQLを書くことは可能ですか? – Ali

+0

@Aliなぜ100個のドキュメントしか必要ない場合は、すべてのIDが必要ですか?私はあなたが外側のクエリで追加の注文をしないのを見ているので、ここで(そして内部のものではない)限界点は何ですか?そして外側のクエリに私の答えをスライスしてみてください、私はそれがあなたが必要なものを得るだろうと思う(私はまだ理解していない間になぜ)。 – DrTyrsa

+0

あなたは正しいです、私は100のドキュメントだけが必要なときに、それらのIDをすべて取得する意味がありません。 クイック編集:Djangoによって生成されたクエリを出力するにはどうすればよいですか? – Ali

関連する問題