2016-04-13 2 views
0

Ich habe zwei Modelle in meinem Django-ProjektDjango SQL __str__ zu reduzieren fragt

class BookSerie(models.Model): 
    id = models.AutoField(primary_key=True) 
    title = models.CharField(max_length=255) 

class BookVolume(models.Model): 
    isbn = models.CharField(max_length=17) 
    volumeNumber = models.PositiveIntegerField() 
    serie = models.ForeignKey(BookSerie) 

    def __str__(self): 
     return self.serie.title+" volume "+str(self.volumeNumber)+" - "+str(self.isbn) 

Ich verwende nur __ str __ für mein Admin-Panel, aber wenn ich diesen Code in meiner Ansicht verwenden (serie mit id = 1 haben 5 Band):

def serieDetails(request, title): 
    try: 
     seriequery = BookSerie.objects.get(slug=title) 
     BookVolume.objects.filter(serie=seriequery).order_by('volumeNumber') 
    except BookSerie.DoesNotExist: 
     raise Http404("Serie does not exist") 

    return render(request, 'book/serieDetails.html', {'serie': seriequery, 'volumes' : volumesquery}) 

ich habe eine wichtige Frage:

Abfrage SELECT ••• FROM "book_bookserie" WHERE "book_bookserie" "id" = '1' 5-mal durchgeführt wird (Debug-Toolbar django geben. diese Codezeile return self.serie.title +“Lautstärke "+ str (self.volumeNumber) +" - "+ str (self.isbn)

Abfrage SELECT ••• FROM "book_bookvolume" WHERE "book_bookvolume"" serie_id. "= '1' ORDER BY "book_bookvolume"." Volume“ASC ausgeführt wird 2 mal

Antwort

1

In Ihrem BookVolume‚s __str__ Sie self.serie.title zugreifen. Dies trifft die Datenbank jedes Mal, da der entsprechende BookSerie Datensatz abgerufen werden muss. Ein Weg, um Anfragen hier zu reduzieren, ist select_related zu verwenden, wenn Sie Ihre BookVolume abfragen:

# any reason why you don't store this QuerySet to a variable? 
BookVolume.objects.filter(serie=seriequery).order_by('volumeNumber').select_related('serie') 

# better: 
seriequery.bookvolume_set.order_by('volumeNumber').select_related('serie') 

Aus der Dokumentation: select_related ...

... wird „folgen“ Fremdschlüsselbeziehungen, Auswählen zusätzlicher verwandter Objektdaten, wenn sie ihre Abfrage ausführt. Dies ist ein Performance-Booster, der zu einer komplexeren Abfrage führt, aber bedeutet, dass die spätere Verwendung von Fremdschlüsselbeziehungen keine Datenbankabfragen erfordert.

+0

Vielen Dank! Sie haben mein Problem mit __ str __ gelöst, aber ich habe immer noch Probleme mit der zweiten Abfrage. – Punyama

Verwandte Themen