【问题标题】:difference between values() and only()values() 和 only() 的区别
【发布时间】:2012-08-12 01:35:32
【问题描述】:

使用有什么区别:

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

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

【问题讨论】:

    标签: django django-queryset


    【解决方案1】:

    values() 返回 QuerySet - 迭代时返回代表模型的字典。它不返回模型对象。

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

    【讨论】:

      【解决方案2】:

      假设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,它本质上是一个字典列表,而不是模型实例 (Blabla)。

      【讨论】:

        【解决方案3】:

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

        .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。这可能是因为它会输出一个您以后可以使用的模型,正如其他答案所提到的那样。

        【讨论】:

        • 哦,很有趣。这确实是一个很好的补充。谢谢你带来它!
        【解决方案4】:

        .values() 给你“不到模特”;它返回的项目比完整模型更接近字典,这意味着您不会获得模型属性,但您也不必初始化完整模型。

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

        【讨论】:

        • 它返回的项目不是接近 dicts,他们are dicts
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-05-27
        • 2014-10-15
        • 2013-12-29
        • 2017-01-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多