在Django中,下面这两个有什么区别:
Article.objects.values_list('comment_id', flat=True).distinct()
VS
Article.objects.values('comment_id').distinct()
我的目标是获得每篇文章下唯一的评论id列表。我已经阅读了文档(实际上两种方法都用过)。结果明显相似。
在Django中,下面这两个有什么区别:
Article.objects.values_list('comment_id', flat=True).distinct()
VS
Article.objects.values('comment_id').distinct()
我的目标是获得每篇文章下唯一的评论id列表。我已经阅读了文档(实际上两种方法都用过)。结果明显相似。
values()方法返回一个包含字典的QuerySet:
<QuerySet [{'comment_id': 1}, {'comment_id': 2}]>
values_list()方法返回一个包含元组的QuerySet:
<QuerySet [(1,), (2,)]>
如果你使用values_list()一个字段,你可以使用flat=True返回一个单一值的QuerySet,而不是1元组:
<QuerySet [1, 2]>
值()
当作为可迭代对象使用时,返回一个QuerySet,返回字典,而不是模型实例。
values_list ()
当作为可迭代对象使用时,返回一个QuerySet,返回元组列表,而不是模型实例。
不同的()
Distinct用于消除重复的元素。
例子:
>>> 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 / values_list的官方文档。书中有很多有用的例子,解释得很清楚。django文档对用户非常友好。
这里有一个简短的片段,让SO评论者高兴:
值
当作为可迭代对象使用时,返回一个QuerySet,返回字典,而不是模型实例。
阅读下面的部分:
value_list
这类似于values(),只是它在迭代时返回元组而不是字典。
"values()"返回一个字典的QuerySet。
例如:
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()"返回元组的QuerySet。
例如:
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"返回一个QuerySet值。*No或一个字段“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