什麼是兩者的區別:你 「小於模型」(只有()
Blabla.objects.values('field1', 'field2', 'field3')
和
Blabla.objects.only('field1', 'field2', 'field3')
什麼是兩者的區別:你 「小於模型」(只有()
Blabla.objects.values('field1', 'field2', 'field3')
和
Blabla.objects.only('field1', 'field2', 'field3')
假設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
實質上是一個字典列表(在正常的QuerySet
是Blabla
對象的列表)。
.values()
走樣;它返回的項目比完整模型更接近字典,這意味着您不會獲得模型屬性,但是您也不必初始化完整模型。
.only()
將SQL中的字段列表限制爲您關心的特定字段,但仍會初始化完整模型;它會推遲加載其他字段,直到您訪問它們(如果有的話)。
values()
返回一個特殊的ValueQuerySet
- 迭代時返回代表模型的字典。它不返回模型對象。
only()
是制約列返回,並確保的方式只有那些列返回立即 - 這就是爲什麼它有時也被稱爲的defer()
相反跟它SELECT foo, bar, zoo FROM
,而不是相當於正常的SELECT [all columns] FROM
。它會返回一個QuerySet
,可以進一步鏈接。
它返回的項目不*接近* 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