Как мне перевести этот SQL-запрос на Django? - PullRequest
0 голосов
/ 20 января 2012

У меня есть запрос SQL в PostgreSQL, который я хотел бы перевести на 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 таблицы: Document и TokenIndex.Отношение 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]

Как видите, проблема в том, что я иду в базу данныхчтобы получить список идентификаторов, а затем вернуться обратно, чтобы получить документы.Это неэффективно, потому что я могу иметь дело с миллионами идентификаторов документов, в то время как меня интересует только небольшое подмножество (определенное переменной max_res и LIMIT в SQL.

Как мнеперевести запрос SQL в Django? Я хочу, чтобы запрос Django был похож на тот, который я написал вручную, в том смысле, что он возвращает только 100 документов, например, а не 1.000.000 идентификаторов документов, а затем 100 документов.

1 Ответ

2 голосов
/ 20 января 2012
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 идентификаторов документов, просто верните 100, вам нужно LIMIT во внутреннем запросе, а не во внешнем запросе.

В любом случае, я думаю, что если вы даже используетеLIMIT с внешним запросом он все равно преобразуется в нужный вам SQL.

...