Django: Paginator + raw-SQL-Abfrage

Bin ich mit Django Paginator überall auf meiner website und schrieb sogar einen speziellen template tag, um zu machen es bequemer. Aber jetzt habe ich zu einem Zustand, wo ich brauche, um eine komplexe custom raw-SQL-Abfrage, die ohne LIMIT zurück über 100K Datensätze.

Wie kann ich mit Django Pagintor mit benutzerdefinierten Abfrage?

Vereinfachtes Beispiel für mein problem:

Mein Modell:

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();

Die Art, wie ich pagintation mit 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)

Diese Weise, Django sehr smart und fügt LIMIT zu einer Abfrage bei der Ausführung. Aber wenn ich custom manager:

all_objects = Person.objects.complicated_list();

alle Daten ausgewählt werden, und nur dann python-Liste ist in Scheiben geschnitten, was SEHR langsam ist. Wie kann ich meine custom-manager Verhalten sich ähnlich wie die eingebauten in einem?

  • In Python, sollten Sie nicht verwenden Leerzeichen, wenn Sie so wollen, in Ihrer Person-Klasse.
InformationsquelleAutor Silver Light | 2010-03-28
Schreibe einen Kommentar