Django values_list vs values

Has*_*aig 107 django django-models django-orm django-queryset

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

Article.objects.values_list('comment_id', flat=True).distinct()
Run Code Online (Sandbox Code Playgroud)

VS

Article.objects.values('comment_id').distinct()
Run Code Online (Sandbox Code Playgroud)

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

Ala*_*air 190

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

<QuerySet [{'comment_id': 1}, {'comment_id': 2}]>
Run Code Online (Sandbox Code Playgroud)

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

<QuerySet [(1,), (2,)]>
Run Code Online (Sandbox Code Playgroud)

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

<QuerySet [1, 2]>
Run Code Online (Sandbox Code Playgroud)

  • values()返回一个QuerySet而不是一个list。尽管由values()返回的对象看起来像一个list,但在某些情况下它的行为不像一个对象。例如,除非将其转换为“列表”,否则它将无法json序列化。 (3认同)
  • 只需使用 `list` 函数,您就可以轻松地将返回值从 `values_list` 转换为真正的 Python 列表:`list(Article.objects.values_list('comment_id', flat=True).distinct())` (3认同)
  • 不,我不认为`distinct()`的作用有所不同.重要的是您要使用哪种数据结构. (2认同)

Ibr*_*sim 39

值()

返回一个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}]
Run Code Online (Sandbox Code Playgroud)

  • 所以这是一个在"值"的情况下返回的字典列表 (2认同)
  • 只是为了澄清:“distinct()”消除了查询结果中的重复元素,而不是数据库中的重复元素。 (2认同)

小智 13

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'}]>
Run Code Online (Sandbox Code Playgroud)

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',)]>
Run Code Online (Sandbox Code Playgroud)

values_list()withflat=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
Run Code Online (Sandbox Code Playgroud)


小智 5

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

set(Article.objects.values_list('comment_id', flat=True))
Run Code Online (Sandbox Code Playgroud)

  • 这比使用“distinct()”在数据库级别消除重复项要慢得多。 (7认同)
  • 此外,使用 set() 将强制对整个表进行查询,而 QuerySet(由 `distinct()` 返回)将仅在需要时流式传输数据。 (2认同)