2016-04-13 62 views
0

我有兩個型號在我的Django項目Django的__str__減少SQL查詢

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) 

我只用__海峽__我的管理面板,但是當我在我看來,使用此代碼(系列與ID = 1有5個卷):

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}) 

我有一個重要的問題:

查詢SELECT•••從執行 「book_bookserie」, 「ID」= '1' 的5倍(Django的調試工具欄給予 「book_bookserie」。此代碼行返回self.serie.title +」音量 「+ STR(self.volumeNumber)+」 - 「+ STR(self.isbn)

查詢 SELECT•••FROM 」book_bookvolume「 WHERE 」book_bookvolume「」 serie_id。 「= '1' ORDER BY 」book_bookvolume「。」 volumeNumber」 ASC 進行2次

回答

1

在你BookVolume__str__訪問self.serie.title。這每次都會觸發數據庫,​​因爲必須檢索相應的BookSerie記錄。在這裏查詢降低的方法之一是使用select_related當您查詢您的BookVolume

# 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') 

從文檔: select_related ...

...將「跟隨」外鍵關係,在執行查詢時選擇其他相關對象數據。這是一個性能提升者,它會導致一個更復雜的查詢,但意味着以後使用外鍵關係不需要數據庫查詢。

+0

謝謝! 您使用__ str __解決了我的問題,但第二個查詢仍然存在問題。 – Punyama