2016-07-28 12 views
0

Ich versuche, eine Abfrage für seitenweise Ergebnisse, wie diese Model.objects.all()[start: start+page_size].Slice auf Django Model Queryset

Ich möchte auch wissen, ob es mehr Seiten zu laden, das heißt, ich möchte wissen, ob start+page_size < Model.objects.all().count().

Meine Frage ist, wenn ich all() zweimal hier nennen, ob Django die gleiche Abfrage ausgeführt wird zweimal (eine für den Scheibenbetrieb [], eine für count()).

Eine andere Frage ist, ob ich auf einem Model.objects.all() wie diese Model.objects.all()[2:9] schneiden, ob Django alle Daten von DB und in Scheiben schneiden von Python holen, oder Django nur mit SQL Limit limit 2 to 9

+0

BTW, richtige Art und Weise für Paginierung in Django ist hier https://docs.djangoproject.com/en/1.9/topics/pagination/ – Compadre

Antwort

3

holen Ja, es zwei Abfragen macht, aber diese sind nicht die "gleiche Frage" überhaupt. Einer ist SELECT * FROM mymodel LIMIT <page_size> OFFSET <start> und der andere ist SELECT COUNT(*) FROM mymodel.

Wenn Sie zwei Abfragen vermeiden möchten, eine einfache Lösung ist für einen weiteren Rekord fragen, als Sie tatsächlich benötigen:

Model.objects.all()[start: start+page_size+1] 

dann können Sie durchlaufen bis PAGE_SIZE und auf die Schaltfläche Weiter, wenn die zusätzliche zeigen Rekord ist da.

+0

Vielen Dank, Daniel. Es ist wirklich ein cleverer Trick! –

+0

Wenn 'result = Model.objects.all() [a: a + 101]' und dann Slice auf das Ergebnis 'sliced ​​= result [a: a + 100]' oder len() 'len (result)', wird Django machen zwei Abfragen? –

+0

https://docs.djangoproject.com/de/1.9/ref/models/querysets/#when-querysets-are-evaluated – Compadre