259 votes

Django values_list vs values

Dans Django, quelle est la différence entre les deux éléments suivants :

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

vs

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

Mon objectif est d'obtenir une liste d'identifiants uniques pour chaque commentaire. Article . J'ai lu la documentation (et j'ai en fait utilisé les deux approches). Les résultats semblent manifestement similaires.

0 votes

Avec values_list, vous pouvez faire if self.id in Article.objects.values_list('comment_id', flat=True): lorsque vous utilisez des valeurs, vous devez accéder au dictionnaire

1 votes

@dnaranjo - Vous pourriez, mais pourquoi ne pas simplement faire Article.objects.filter(comment_id=self.id).exists() ?

2 votes

C'est une réponse à une autre question.

417voto

Alasdair Points 36535

Le site values() La méthode renvoie un QuerySet contenant des dictionnaires :

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

Le site values_list() renvoie un QuerySet contenant des tuples :

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

Si vous utilisez values_list() avec un seul champ, vous pouvez utiliser flat=True pour retourner un QuerySet de valeurs simples au lieu de 1-tuples :

<QuerySet [1, 2]>

0 votes

Oh, et aucune différence entre les deux en ce qui concerne la manière dont les enfants sont traités. distinct() est utilisée, hein ?

3 votes

Non, je ne pense pas distinct() fonctionne différemment. L'important est de savoir avec quelle structure de données vous voulez travailler.

5 votes

Le site values() renvoie un QuerySet et non un list . Bien que l'objet renvoyé par values() ressemble à un list mais il ne se comporte pas comme tel dans certains cas. Par exemple, il ne sera pas sérialisable par json à moins que nous le convertissions en une `liste'.

93voto

Ibrahim Kasim Points 415

Valeurs()

Renvoie un QuerySet qui renvoie dictionaries plutôt que des instances de modèle, lorsqu'il est utilisé comme un itérable.

liste de valeurs()

Renvoie un QuerySet qui renvoie list of tuples plutôt que des instances de modèle, lorsqu'il est utilisé comme un itérable.

distinct()

distincts sont utilisés pour eliminate the duplicate éléments.

Exemple :

>>> 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}]

2 votes

Il s'agit donc d'une liste de dictionnaires qui est retournée en cas de values

2 votes

Juste pour clarifier : distinct() élimine les éléments en double des résultats de la requête, et non de la base de données.

5voto

pitu Points 11

Vous pouvez obtenir les différentes valeurs avec :

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

8 votes

Cela sera beaucoup plus lent que d'utiliser distinct() pour éliminer les doublons au niveau de la base de données.

3 votes

De plus, l'utilisation de set() forcera une requête sur l'ensemble de la table, alors qu'un QuerySet (renvoyé par la fonction distinct() ) ne diffusera les données qu'en cas de besoin.

1voto

run_the_race Points 1700

Le meilleur endroit pour comprendre la différence est le site Web de la Commission européenne. documentation officielle sur les valeurs / liste des valeurs . Il contient de nombreux exemples utiles et explique tout très clairement. La documentation de Django est très conviviale.

Voici un court extrait pour satisfaire les critiques de SO :

valeurs

Renvoie un QuerySet qui renvoie des dictionnaires, plutôt que des instances de modèle, lorsqu'il est utilisé comme itérable.

Et lisez la section qui la suit :

liste de valeurs

Cette méthode est similaire à values() sauf qu'au lieu de retourner des dictionnaires, elle retourne des tuples lorsqu'elle est itérée.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X