Django values_list 与价值观

Django values_list vs values

在Django中,下面两个有什么区别:

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

对比

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

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

values() 方法 return 是一个包含字典的查询集:

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

values_list()方法return是一个包含元组的查询集:

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

如果您对单个字段使用 values_list(),则可以使用 flat=True 到 return 单个值的 QuerySet 而不是 1 元组:

<QuerySet [1, 2]>

值()

Returns returns dictionaries 的 QuerySet,而不是模型实例,当用作可迭代对象时。

values_list()

Returns returns 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}]

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

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

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

这里有一个让 SO 审阅者满意的简短片段:

Returns a QuerySet that returns dictionaries, rather than model instances, when used as an iterable.

并阅读后面的部分:

value_list

This is similar to values() except that instead of returning dictionaries, it returns tuples when iterated over.