2013-05-21 91 views
1
Class Model(models.Model): 
    ....... 
    ....... 
    ....... 
    ....... 
    first_name = models.CHarField(max_length = 50) 
    last_name = models.CharField(ma_lenghth = 50) 

    def full_name(): 
     return '%s %s' %(self.first_name, self.last_name) 
  • 調用Models.objects.get().full_name()將有效

Django的模型優化

  • Model.objects.filter().values('first_name, 'last_name'),比 添加字符串後會更好。

問題在於數據庫優化。基本上我想知道如果調用模型的方法加載整個對象或不。如果不是,我覺得兩者都會導致相同的數據庫操作,但是如果它加載整個對象而不是值方法會更好地優化。

請回復。如果您有關於此主題的信息,請分享您的任何經驗,如果您有任何經驗,請與任何統計數據進行比較 請注意,這是一個示例,而不是實際使用案例,該模型還包含許多其他字段。

很少會覺得使用defer()only()也會給出預期的結果。但是我在django文檔中發現,它基本上只能防止這些字段數據被轉換爲python對象,而不是用sql查找。所以我認爲這不會更好。 請幫我出來 在此先感謝。

回答

0

問題不在於「調用模型的方法是否加載整個對象」,因爲這是無關緊要的。 「整個對象的加載」已由get調用完成。該方法將對由該調用返回的模型對象進行操作,除非您另行指定(例如使用deferonly)將是整個對象。

+0

所以將使用延遲或只使用值相同Django文檔指定在構建具有延遲字段的模型時存在輕微的開銷。我不完全能夠理解的是,開銷是多少,如果它更好地使用價值的東西。 –

+0

不,'defer' /'只'給你一個實際的模型實例,你可以在其上調用你的方法,但是缺少一些字段。 'values'給你一個字典,而不是一個實例,所以你不能調用你的方法。在這一點上,雖然我不禁感到你在過度優化:你是否檢查過這實際上是一個瓶頸? –

+0

那麼你是說調用model.objects.only('first_name','last_name')。get()。full_name()將與調用values方法相同。但我認真地懷疑這是唯一的方法是防止從sql到python對象的轉換,而不是在sql級別查找。所以我認爲這可能不會那麼快。 –

0

當您使用getfilter,然後訪問這些查詢對象中的對象時,當且僅當您使用您正在訪問的模型的字段時,纔會得到額外的查詢。例如,在你的情況下,這些字段將是first_namelast_name

但是,如果您有其他模型的外鍵,則不同。當您嘗試訪問該模型的字段時,您之前所做的簡單查詢不會從數據庫獲取其他對象。所以當你試圖訪問它時,你將會再次訪問你的數據庫。要解決此問題,您應該看到文檔select_relatedprefetch_related

希望它有幫助!