In Django, what's the difference between the following two:
Article.objects.values_list('comment_id', flat=True).distinct()
vs
Article.objects.values('comment_id').distinct()
My goal is to get a list of unique comment ids under each Article
. I've read the documentation (and in fact have used both approaches). The results overtly seem similar.
The values()
method returns a QuerySet containing dictionaries:
<QuerySet [{'comment_id': 1}, {'comment_id': 2}]>
The values_list()
method returns a QuerySet containing tuples:
<QuerySet [(1,), (2,)]>
If you are using values_list()
with a single field, you can use flat=True
to return a QuerySet of single values instead of 1-tuples:
<QuerySet [1, 2]>
values()
Returns a QuerySet that returns dictionaries
, rather than model instances, when used as an iterable.
values_list()
Returns a QuerySet that returns list of tuples
, rather than model instances, when used as an iterable.
distinct()
distinct are used to eliminate the duplicate
elements.
Example:
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}]
You can get the different values with:
set(Article.objects.values_list('comment_id', flat=True))