Я использую Django Paginator повсюду на своем сайте и даже написал специальный тег шаблона, чтобы сделать его более удобным. Но теперь я попал в состояние, когда мне нужно сделать сложный пользовательский необработанный запрос SQL, который без LIMIT
вернет около 100 тыс. Записей.
Как использовать Django Pagintor с пользовательским запросом?
Упрощенный пример моей проблемы:
Моя модель:
class PersonManager(models.Manager):
def complicated_list(self):
from django.db import connection
#Real query is much more complex
cursor.execute("""SELECT * FROM `myapp_person`""");
result_list = []
for row in cursor.fetchall():
result_list.append(row[0]);
return result_list
class Person(models.Model):
name = models.CharField(max_length=255);
surname = models.CharField(max_length=255);
age = models.IntegerField();
objects = PersonManager();
Как я использую пагинацию с Django ORM:
all_objects = Person.objects.all();
paginator = Paginator(all_objects, 10);
try:
page = int(request.GET.get('page', '1'))
except ValueError:
page = 1
try:
persons = paginator.page(page)
except (EmptyPage, InvalidPage):
persons = paginator.page(paginator.num_pages)
Таким образом, Django становится очень умным и добавляет LIMIT
к запросу при его выполнении. Но когда я использую собственный менеджер:
all_objects = Person.objects.complicated_list();
все данные выбраны, и только после этого список Python разрезается, что ОЧЕНЬ медленно. Как сделать так, чтобы мой пользовательский менеджер вел себя так же, как встроенный?