使用有什么区别:
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
返回字典的 a,它本质上是一个字典列表,而不是模型实例 ( Blabla
)。
.values()
给你“不到一个模型”;它返回的项目比完整模型更接近字典,这意味着您不会获得模型属性,但您也不必初始化完整模型。
.only()
将 SQL 中的字段列表限制为您关心的特定字段,但仍会初始化完整模型;它会延迟加载其他字段,直到您访问它们(如果有的话)。
到目前为止给出的答案是正确的,但他们没有提到查询方面的一些差异。我只会报告他们。
.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
记录的。这可能是因为它会输出一个您以后可以使用的模型,正如其他答案所提到的那样。
values()
return - 迭代时返回QuerySet
表示模型的字典。它不返回模型对象。
only()
是一种限制返回的列,并确保只立即返回那些列的方法——这就是为什么它有时被称为它的对立面,defer()
它相当于说SELECT foo, bar, zoo FROM
而不是正常的SELECT [all columns] FROM
。它将返回一个QuerySet
可以进一步链接的。