【问题标题】:Django values_list vs valuesDjango values_list 与值
【发布时间】:2016-09-09 09:39:12
【问题描述】:

在Django中,以下两者有什么区别:

Article.objects.values_list('comment_id', flat=True).distinct()

Article.objects.values('comment_id').distinct()

我的目标是在每个 Article 下获取唯一评论 ID 列表。我已经阅读了文档(实际上已经使用了这两种方法)。结果明显相似。

【问题讨论】:

  • 使用 values_list 你可以if self.id in Article.objects.values_list('comment_id', flat=True): 同时使用你需要访问字典的值
  • @dnaranjo - 你可以,但为什么不直接做Article.objects.filter(comment_id=self.id).exists()
  • 这是另一个问题的答案

标签: django django-models django-queryset django-orm


【解决方案1】:

values() 方法返回一个包含字典的 QuerySet:

<QuerySet [{'comment_id': 1}, {'comment_id': 2}]>

values_list() 方法返回一个包含元组的 QuerySet:

<QuerySet [(1,), (2,)]>

如果您将 values_list() 与单个字段一起使用,则可以使用 flat=True 返回单个值的 QuerySet,而不是 1 元组:

<QuerySet [1, 2]>

【讨论】:

  • 哦,两者之间没有区别 distinct() 是如何使用的吧?
  • 不,我不认为distinct() 的工作方式有任何不同。重要的是您要使用哪种数据结构。
  • values() 返回 QuerySet 而不是 list。尽管values() 返回的对象看起来像list,但在某些情况下它的行为并不像一个。例如,除非我们将其转换为 `list',否则它不会是 json 可序列化的
  • @AbhijitGhate 好点,我已经更新了答案以使其更清晰。
  • 您只需使用list 函数即可轻松地将values_list 的返回值转换为真正的Python 列表:list(Article.objects.values_list('comment_id', flat=True).distinct())
【解决方案2】:

值()

当用作可迭代对象时,返回一个返回 dictionaries 而不是模型实例的 QuerySet。

values_list()

当用作可迭代对象时,返回一个返回 list of tuples 而不是模型实例的 QuerySet。

区别()

distinct 用于eliminate the duplicate 元素。

例子:

>>> list(Article.objects.values_list('id', flat=True)) # flat=True will remove the tuples and return the list   
[1, 2, 3, 4, 5, 6]

>>> list(Article.objects.values('id'))
[{'id':1}, {'id':2}, {'id':3}, {'id':4}, {'id':5}, {'id':6}]

【讨论】:

  • 所以这是在values的情况下返回的字典列表
  • 澄清一下:distinct() 消除了查询结果中的重复元素,而不是数据库中的重复元素。
【解决方案3】:

了解差异的最佳地点是official documentation on values / values_list。它有很多有用的例子并且解释得非常清楚。 django 文档对用户非常友好。

这里有一个简短的 sn-p 让 SO 审阅者满意:

价值观

当用作可迭代对象时,返回一个返回字典而不是模型实例的 QuerySet。

并阅读其后面的部分:

value_list

这类似于 values() ,只是它不是返回字典,而是在迭代时返回元组。

【讨论】:

    【解决方案4】:

    您可以通过以下方式获得不同的值:

    set(Article.objects.values_list('comment_id', flat=True))
    

    【讨论】:

    • 这将比使用distinct() 在数据库级别消除重复要慢。
    • 另外,当 QuerySet(由distinct() 返回)将仅在需要时流式传输数据时,使用 set() 将强制对整个表进行查询。
    猜你喜欢
    • 1970-01-01
    • 2011-07-09
    • 1970-01-01
    • 1970-01-01
    • 2017-12-17
    • 2013-11-28
    • 2012-01-25
    • 2016-08-02
    • 2011-09-18
    相关资源
    最近更新 更多