2012-11-16 75 views
1

假設我有:django - 什麼時候.objects.get()評估?

class Library(models.Model): 
    name = models.CharField(max_length = 100) 

class Books(models.Model): 
    library = models.ForeignKey(Library) 
    book = models.CharField(max_length = 100) 

我想創建一個新的Books,我們知道我們可以只用Library的ID填補Books庫,但我們也可以使用Library實例。我的問題是,如果我們只提供ID,會更好嗎?如果我想使用該實例,那麼我必須使用.get()進行評估,然後才能訪問數據庫?

附加問題:從文檔中,queryset是懶惰的,它不會直到被評估纔打到數據庫,所以queryset何時被評估?

回答

6

是的,.get()立即進行評估。當然,使用ID將避免數據庫查詢。

get不懶,因爲它不返回QuerySet - 它返回模型的單個實例。 QuerySets來自像.filter()之類的東西,所以例如Library.objects.filter(id=5)被懶惰地評估,而Library.objects.get(id=5)被立即評估。

QuerySet的實際評估包含在docs中 - 基本上,無論您何時從QuerySet中實際提取值,都會對其進行評估。完整列表是:

  • 迭代
  • 切片
  • 酸洗
  • repr()
  • len()
  • list()
  • bool()
+0

請注意,切片未評估的QuerySet通常會返回另一個未評估的QuerySet。 – Alasdair

+0

我相信get也是懶得評價的。在訪問變量之前,您不會訪問數據庫https://docs.djangoproject.com/zh/dev/topics/db/optimization/#understand-cached-attributes – ppetrid

+0

@ppetrid這就是關於查找相關變量的問題。如果您安裝了django調試工具欄,可以非常容易地通過在'debugsqlshell'內調用'get'來立即驗證get' - 您將看到立即生成並執行查詢。 –

相關問題