2015-08-24 32 views
0

這兩種類型的查詢之間的性能差異有多大?模型和外部模型的調用值之間的性能差異

說我有這3種型號:

class Brand(models.Model): 
    brand_name = models.CharField() 

class Model(models.Model): 
    brand = Models.ForeignKey(Brand) 
    model_name = models.CharField() 

class Listing(models.Model): 
    model = Models.ForeignKey(Model) 
    listing_info = models.CharField() 

我有幾千個清單,我在我的模板顯示,我想顯示每個上市BRAND_NAME和模型名稱。

在模板我列出這是這樣:

<p>{{ listing.model.brand.brand_name }}</p> 
<p>{{ listing.model.model_name }}</p> 
<p>{{ listing.listing_info }}</p> 

現在考慮,如果我就在上市模式(重複數據)中列出的這些值:

class Listing(models.Model): 
    model = Models.ForeignKey(Model) 
    brand_name = models.CharField() 
    model_name = models.CharField() 
    listing_info = models.CharField() 

然後在模板我可以簡單列出如下:

<p>{{ listing.brand_name }}</p> 
<p>{{ listing.model_name }}</p> 
<p>{{ listing.listing_info }}</p> 

思考超出了數據重複的問題,這兩個設置之間有很大的性能差異?

回答

4

如果您使用select_related,那麼Django將在獲取相關列表的同時獲取相關的modelbrand數據。

Listing.objects.filter().select_related('model', 'model__brand') 

舉一個例子,假設你有100個房源。如果沒有select_related,則會有201個查詢(1個查詢獲取所有列表,100個獲取每個列表的模型,100個獲取每個模型的品牌)。使用select_related,所有內容都在1個查詢中提取。理論上,對數據進行非規格化(在Listing模型中複製屬性)可能會提供進一步的性能優勢,但改進可能可以忽略不計。你將不得不測量它看到。大多數情況下,使用select_related就足夠了。

相關問題