Django values_list vs values

时间:2016-05-13 09:07:48

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

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

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

vs

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

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

4 个答案:

答案 0 :(得分:147)

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

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

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

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

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

<QuerySet [1, 2]>

答案 1 :(得分:32)

值()

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

values_list()

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

不同()

distinct用于eliminate the duplicate元素。

示例:

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

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

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

这里有一个简短的摘要,以使SO评论者满意:

返回一个查询集,该查询集在用作迭代时将返回字典,而不是模型实例。

并阅读其后的部分:

value_list

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