Estoy usando Django Paginator en todas partes en mi sitio web e incluso escribí una etiqueta de plantilla especial, para que sea más conveniente. Pero ahora llegué a un estado en el que necesito hacer una consulta compleja de SQL sin formato, que sin un LIMIT
devolverá unos 100K registros.Django: Paginator + consulta SQL sin procesar
¿Cómo puedo utilizar Django Pagintor con una consulta personalizada?
ejemplo simplificado de mi problema:
Mi modelo:
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();
La forma en que uso pagintation con 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)
De esta manera, Django se ponen muy inteligente, y agrega LIMIT
a una consulta al ejecutarlo. Pero cuando se utiliza gestor de encargo:
all_objects = Person.objects.complicated_list();
se selecciona todos los datos, y sólo entonces se corta lista de Python, que es muy lento. ¿Cómo puedo hacer que mi administrador personalizado se comporte de forma similar al construido en uno?
En Python, no debe usar espacios en blanco cuando lo desee en su clase Person. – Gereltod