2016-07-21 13 views
0

Wenn ich habe:django schnellste Anforderung zwischen Abfrage und Sub-Abfrage

class Record(models.Model): 

    start_time = models.Integerfield() Timestamp 

Und in einer Ansicht möchte ich über die Tage zwischen Startdatum und Enddatum iterieren.

Ist es schneller zu tun:

records = Record.objects.filter(
    start_time__gte=dt.datetime.timestamp(start_date), 
    start_time__lt=dt.datetime.timestamp(end_date) 
) 
for start_day, stop_day in days_between_start_and_end_date: 
     records_week = records.filter(
    start_time__gte=dt.datetime.timestamp(start_day), 
    start_time__lt=dt.datetime.timestamp(stop_day) 
) 

oder direkt

for start_day, stop_day in days_between_start_and_end_date: 
     records_week = Record.objects.filter(
    start_time__gte=dt.datetime.timestamp(start_day), 
    start_time__lt=dt.datetime.timestamp(stop_day) 
) 

In der Tat habe ich versucht und keinen Unterschied sehen konnte, aber ich verstehe nicht, warum für mich, weil ich tue, eine große Anfrage im ersten Fall und viele kleine im zweiten Fall. Irgendeine Idee warum?

+1

Denken Sie daran, dass Abfragesätze faul sind. Keines dieser Beispiele führt irgendwelche Abfragen aus. – knbk

Antwort

1

In beiden Situationen wird nicht ausgelöst, dass der Abfrage-Satz ausgewertet wird. filter tut nichts anderes, als sql-Anweisung in der Unterstreichungsimplementierung zu verfassen, so dass Sie in keinem der Fälle die Datenbank treffen, sondern nur mehrere SQL-Anweisungen verfasst haben, die in Ihrem Programm enthalten sind. Erst wenn Sie mit der Verwendung der Variablen beginnen, beginnt django mit der Auswertung des Querysets.

Django doc über querysets are lazy. Wenn jede orm-Anweisung die Datenbank trifft, wird sie nicht optimal sein.