Django values_list vs值


146

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

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

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

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


使用values_list,您可以if self.id in Article.objects.values_list('comment_id', flat=True):在使用数值时需要访问字典
-dnaranjo

1
@dnaranjo-您可以但为什么不这样做Article.objects.filter(comment_id=self.id).exists()呢?

1
那是对另一个问题的答案
dnaranjo '16

Answers:


250

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

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

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

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

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

<QuerySet [1, 2]>

哦,两者之间的区别没有什么区别,distinct()呵呵?
哈桑·拜格

2
不,我认为distinct()工作原理没有什么不同。重要的是要使用哪种数据结构。
阿拉斯代尔

3
values()回报QuerySet,而不是一个list。尽管所返回的对象values()看起来像是 list,但在某些情况下它的行为不像一个。例如,除非将其转换为“列表”,否则它将无法json序列化
Abhijit Ghate

@AbhijitGhate的要点是,我已经更新了答案以使其更清楚。
阿拉斯代尔

2
values_list只需使用以下list函数就可以轻松地将返回值转换为真实的Python列表:list(Article.objects.values_list('comment_id', flat=True).distinct())
inostia,

55

values()

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

values_list()

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

不同()

分别用于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
因此,这是在以下情况下返回的词典列表values
Hassan Baig,2013年

只是要澄清distinct()一下:从查询结果而不是数据库中消除重复的元素。
oz19

5

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

set(Article.objects.values_list('comment_id', flat=True))
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.