Как указать максимальные результаты для фильтра запроса в Django? - PullRequest
7 голосов
/ 20 февраля 2011

Я хочу получить первые 500 результатов из большой базы данных, которые соответствуют заданному фильтру запроса.

В настоящее время я использую следующий (ужасно неэффективный) метод.

results = Entries.objects.filter(text__icontains="somequery")[0:500]

Но я думаю, что этот запрос загружает всю базу данных в память, а затем усекает результаты.Это ужасно медленно.

Есть ли более элегантный способ сделать это?Спасибо!

1 Ответ

25 голосов
/ 20 февраля 2011

Это способ сделать это.

Сгенерированный SQL использует LIMIT, поэтому он не загружает всю базу данных в память и не разрезается на python.

Обратите внимание, что вы можете увидеть, что пишет SQL django, используя django.db.connection.queries http://docs.djangoproject.com/en/dev/faq/models/#how-can-i-see-the-raw-sql-queries-django-is-running

Но менее известная хитрость - напечатать queryset.query или вызвать sql = queryset.query.__str__()

>>> results = Entries.objects.filter(text__icontains="somequery")[0:500]
>>> print results.query
SELECT ... FROM ... WHERE ... LIKE ... LIMIT 500
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...