2017-08-01 1 views
1

Ich benutze DRF und ich habe Modell Motocycle, die> 2000 Objekte in DB hat. Modell hat eine Marke. Ich möchte von full_name suchen:Django Filter von annotierten Feld ist zu langsam

queryset = Motocycle.objects.prefetch_related(
     "brand" 
     ).annotate(
      full_name=Concat(
       'brand__title', 
       Value(' - '), 
       'title', 
      ) 
     ) 
    ) 

ich von full_name filtern möchten, aber Abfrage läuft sehr langsam:

(1.156) SELECT "mp_api_motocycle"."id"... 

Ohne Filterung mit Paginierung:

(3.980) SELECT "mp_api_motocycle"."id"... 

Es gibt einige ist Möglichkeit, diese Abfrage schneller zu machen?

Antwort

1

Behalten Sie Ihre Annotation full_name als Spalte in der Datenbank und fügen Sie ihr einen Index hinzu.

Andernfalls führen Sie einen vollständigen Tabellenscan durch, während Sie full_name berechnen und danach sortieren.

+0

'full_name' wird eine DB-Spalte und ein Modellattribut sein, welches aktualisiert wird, bevor das Modell gespeichert wird? Oder ich habe dich falsch verstanden? Vielen Dank. –

+0

Ja, es wird Modellfeld sein, das beim Speichern aktualisiert wird, es kann gesagt werden, dass dies Bit Denormierung ist, um die Leistung zu verbessern – iklinac

+1

Auch, warum verwenden Sie prefetch_related, wenn es nur eine Marke gibt, besser zu verwenden selected_related – iklinac