2012-08-15 65 views
6

什麼是兩者的區別:你 「小於模型」(只有()

Blabla.objects.values('field1', 'field2', 'field3') 

Blabla.objects.only('field1', 'field2', 'field3') 

回答

4

假設Blabla在你的問題中的字段,以及field4

Blabla.objects.only('field1', 'field2', 'field3')[0].field4 

將返回該對象的field4的值(用新的數據庫查詢檢索信息),而

Blabla.objects.values('field1', 'field2', 'field3')[0].field4 

會給

AttributeError: 'dict' object has no attribute 'field4' 

這是因爲.values()基於現有的QuerySet返回ValuesQuerySet,該QuerySet實質上是一個字典列表(在正常的QuerySetBlabla對象的列表)。

3

.values()走樣;它返回的項目比完整模型更接近字典,這意味着您不會獲得模型屬性,但是您也不必初始化完整模型。

.only()將SQL中的字段列表限制爲您關心的特定字段,但仍會初始化完整模型;它會推遲加載其他字段,直到您訪問它們(如果有的話)。

+4

它返回的項目不*接近* dicts,它們[*是* dicts](https://github.com/django/django/blob/stable/1.4.x/django/db/models/ query.py#L946) – supervacuo 2012-08-15 18:21:59

1

values()返回一個特殊的ValueQuerySet - 迭代時返回代表模型的字典。它不返回模型對象。

only()是制約列返回,並確保的方式只有那些列返回立即 - 這就是爲什麼它有時也被稱爲的defer()相反跟它SELECT foo, bar, zoo FROM,而不是相當於正常的SELECT [all columns] FROM。它會返回一個QuerySet,可以進一步鏈接。