Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django值\u列表与值_Django_Django Models_Django Queryset_Django Orm - Fatal编程技术网

Django值\u列表与值

Django值\u列表与值,django,django-models,django-queryset,django-orm,Django,Django Models,Django Queryset,Django Orm,在Django中,以下两者之间的区别是什么: Article.objects.values_list('comment_id', flat=True).distinct() vs 我的目标是在每一篇文章下获得唯一注释ID的列表。我已经阅读了文档(实际上已经使用了这两种方法)。结果明显相似。该方法返回一个包含字典的查询集: <QuerySet [{'comment_id': 1}, {'comment_id': 2}]> 如果对单个字段使用values\u list(),则可以使用

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

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

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

该方法返回一个包含字典的查询集:

<QuerySet [{'comment_id': 1}, {'comment_id': 2}]>
如果对单个字段使用
values\u list()
,则可以使用
flat=True
返回单个值的查询集,而不是1元组:

<QuerySet [1, 2]>

values() 返回一个查询集,当用作iterable时,该查询集返回
字典
,而不是模型实例

值列表() 返回一个查询集,当用作iterable时,该查询集返回元组列表,而不是模型实例

不同的() 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}]

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

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

理解差异的最好地方是在。它有许多有用的例子,并且解释得非常清楚。django文档用户非常频繁

下面是一个简短的片段,让评论员们感到高兴:

价值观 返回一个查询集,该查询集在用作iterable时返回字典,而不是模型实例

并阅读以下章节:

价值清单 这与values()类似,不同之处在于它在迭代时返回元组,而不是返回字典


哦,这两个vis-a-vis的用法没有什么不同,是吗?不,我认为
distinct()
的工作原理没有任何不同。重要的是要使用哪个数据结构。
values()
返回
QuerySet
而不是
列表。虽然
values()
返回的对象看起来像一个
列表,但在某些情况下它的行为与列表不同。例如,除非我们将其转换为'list'@AbhijitGhate好的一点,我已经更新了答案使其更清楚。您可以通过使用
list
函数将返回值从
values\u list
转换为真正的Python列表:
list(Article.objects.values\u list('comment\u id',flat=true).distinct())
如果在Article.objects.values\u list('comment\u id',flat=True)中使用self.id,则可以使用值列表执行
在使用值时访问dictionary@dnaranjo-可以,但为什么不直接执行
Article.objects.filter(comment\u id=self.id).exists()
?这是一个不同问题的答案,因此它是一个字典列表,在
值的情况下返回,只是为了澄清:
distinct()
从查询结果中而不是从数据库中消除重复元素。这将比在数据库级别使用
distinct()
消除重复元素慢得多。此外,当QuerySet(由
distinct()
返回)仅在需要时流式传输数据时,使用set()将强制对整个表进行查询。
>>> 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}]
set(Article.objects.values_list('comment_id', flat=True))