值()和仅()之间的差异

时间:2012-08-15 18:10:40

标签: django django-queryset

使用之间的区别是什么:

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

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

4 个答案:

答案 0 :(得分:10)

假设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()根据现有的ValuesQuerySet返回QuerySet,这实际上是一个dicts列表(从正常QuerySet列表的意义上来说Blabla个对象)。

答案 1 :(得分:5)

.values()为您提供“不仅仅是模特”;它返回的项目比完整模型更接近字典,这意味着您没有获得模型属性,但您也不必初始化完整模型。

.only()将SQL中的字段列表限制为您关注的特定字段,但仍会初始化完整模型;它推迟加载其他字段,直到你访问它们(如果有的话)。

答案 2 :(得分:2)

values()返回一个特殊的ValueQuerySet - 迭代后返回表示模型的字典。它不返回模型对象。

only()是一种限制返回列的方法,并确保这些列立即返回 - 这就是为什么它有时被称为与defer()相反它相当于说SELECT foo, bar, zoo FROM而不是正常SELECT [all columns] FROM。它将返回可以进一步链接的QuerySet

答案 3 :(得分:2)

到目前为止给出的答案是正确的,但他们没有提到查询方面的一些差异。我只会举报他们。

.get()

# User.objects.get(email='user@email.com').username
SELECT "users_user"."id", "users_user"."password", "users_user"."last_login", 
"users_user"."is_superuser", "users_user"."username", "users_user"."first_name", 
"users_user"."last_name", "users_user"."email", "users_user"."is_staff", "users_user"."is_active", 
"users_user"."date_joined", "users_user"."name"
FROM "users_user" 
WHERE "users_user"."email" = 'user@email.com'; args=('user@email.com',)

.only().get()

# User.objects.only('username').get(email='user@email.com')
SELECT "users_user"."id", "users_user"."username" 
FROM "users_user" 
WHERE "users_user"."email" = 'user@email.com'; args=('user@email.com',)

.values().get()

# User.objects.values('username').get(email='user@email.com')
SELECT "users_user"."username" 
FROM "users_user" 
WHERE "users_user"."email" = 'user@email.com'; args=('user@email.com',)

如您所见,only() 还将选择记录的 id。这可能是因为它会输出一个您以后可以使用的模型,正如其他答案提到的那样。

相关问题