Django Values_list 与 Values

问题描述 投票:0回答:5

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

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

对:

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

我的目标是在每个

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

python python-3.x django django-models django-queryset
5个回答
471
投票

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

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

values_list()
方法返回包含元组的查询集:

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

如果您将

values_list()
与单个字段一起使用,则可以使用
flat=True
返回单个值而不是 1 元组的查询集:

<QuerySet [1, 2]>

104
投票

值()

当用作迭代时,返回一个返回

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

8
投票

“values()” 返回 字典的查询集

例如:

print(User.objects.all().values()) # Return all fields
# <QuerySet [{'id': 1, 'name': 'John'}, {'id': 2, 'name': 'Tom'}]>

print(User.objects.all().values("name")) # Return "name" field
# <QuerySet [{'name': 'John'}, {'name': 'Tom'}]>

“values_list()” 返回 元组的查询集

例如:

print(User.objects.all().values_list()) # Return all fields
# <QuerySet [(1, 'John'), (2, 'Tom')]>

print(User.objects.all().values_list("name")) # Return "name" field
# <QuerySet [('John',), ('Tom',)]>

“values_list()”“flat=True” 返回 值的查询集。 *允许没有或有一个带有 "flat=True" 的字段,并且一个字段必须是 第一个参数,其中 "flat=True" 必须是 第二个参数

例如:

print(User.objects.all().values_list(flat=True)) # Return "id" field
# <QuerySet [1, 2]>

print(User.objects.all().values_list("name", flat=True)) # Return "name" field
# <QuerySet ['John', 'Tom']>

print(User.objects.all().values_list(flat=True, "name")) # Error

print(User.objects.all().values_list("id", "name", flat=True)) # Error

5
投票

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

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

1
投票

了解差异的最佳位置是关于值/values_list的官方文档。它有很多有用的例子并且解释得非常清楚。 django 文档非常用户友好。

这里有一个简短的片段,可以让评论者满意:

价值观

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

并阅读后面的部分:

值列表

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

© www.soinside.com 2019 - 2024. All rights reserved.