在Django中,下面两个有什么区别:
Article.objects.values_list('comment_id', flat=True).distinct()
对比分析
Article.objects.values('comment_id').distinct()
我的目标是在每个Article下得到一个唯一的注解id列表,我已经阅读了文档(实际上两种方法都用过了),结果看起来很相似。
Article
ryhaxcpt1#
values()方法返回包含字典的QuerySet:
values()
<QuerySet [{'comment_id': 1}, {'comment_id': 2}]>
values_list()方法返回包含元组的QuerySet:
values_list()
<QuerySet [(1,), (2,)]>
如果您正在使用values_list()和单个字段,则可以使用flat=True返回单个值的QuerySet,而不是1元组:
flat=True
<QuerySet [1, 2]>
mznpcxlj2#
返回一个QuerySet,该QuerySet在用作可迭代对象时返回dictionaries,而不是模型示例。
dictionaries
返回一个QuerySet,该QuerySet在用作可迭代对象时返回list of tuples,而不是模型示例。
list of tuples
不同的用于eliminate the duplicate元素。示例:
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}]
ggazkfy83#
您可以通过以下方式获得不同的值:
set(Article.objects.values_list('comment_id', flat=True))
8ljdwjyq4#
例如:
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'}]>
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',)]>
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
plupiseo5#
要理解其中的区别,最好的地方是查看values / values_list的官方文档。它有很多有用的例子,并且解释得非常清楚。django文档非常友好。这里有一个简短的片段,让SO评论家高兴:
返回一个QuerySet,该QuerySet在用作可迭代对象时返回字典,而不是模型示例。并阅读下面的部分:
这类似于values(),只是它在迭代时返回元组,而不是返回字典。
5条答案
按热度按时间ryhaxcpt1#
values()
方法返回包含字典的QuerySet:values_list()
方法返回包含元组的QuerySet:如果您正在使用
values_list()
和单个字段,则可以使用flat=True
返回单个值的QuerySet,而不是1元组:mznpcxlj2#
个值()
返回一个QuerySet,该QuerySet在用作可迭代对象时返回
dictionaries
,而不是模型示例。值列表()
返回一个QuerySet,该QuerySet在用作可迭代对象时返回
list of tuples
,而不是模型示例。不同()
不同的用于
eliminate the duplicate
元素。示例:
ggazkfy83#
您可以通过以下方式获得不同的值:
8ljdwjyq4#
例如:
例如:
例如:
plupiseo5#
要理解其中的区别,最好的地方是查看values / values_list的官方文档。它有很多有用的例子,并且解释得非常清楚。django文档非常友好。
这里有一个简短的片段,让SO评论家高兴:
数值
返回一个QuerySet,该QuerySet在用作可迭代对象时返回字典,而不是模型示例。
并阅读下面的部分:
值列表
这类似于values(),只是它在迭代时返回元组,而不是返回字典。