Elenco-valori Django vs valori


146

In Django, qual è la differenza tra i seguenti due:

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

vs

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

Il mio obiettivo è quello di ottenere un elenco di ID di commento univoci in ciascuno di essi Article. Ho letto la documentazione (e in effetti ho usato entrambi gli approcci). I risultati sembrano apertamente simili.


Con valori_elenco puoi fare if self.id in Article.objects.values_list('comment_id', flat=True):mentre usi i valori che devi accedere al dizionario
dnaranjo

1
@dnaranjo - Potresti ma perché non farlo Article.objects.filter(comment_id=self.id).exists()?
Sayse,

1
Questa è una risposta per una domanda diversa
dnaranjo,

Risposte:


250

Il values()metodo restituisce un QuerySet contenente dizionari:

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

Il values_list()metodo restituisce un QuerySet contenente tuple:

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

Se si utilizza values_list()con un singolo campo, è possibile utilizzare flat=Trueper restituire un QuerySet di valori singoli anziché 1-tuple:

<QuerySet [1, 2]>

Oh e nessuna differenza tra i due di fronte a come distinct()viene utilizzato eh?
Hassan Baig,

2
No, non credo distinct()funzioni diversamente. L'importante è con quale struttura di dati si desidera lavorare.
Alasdair,

3
I values()ritorni a QuerySete non a list. Sebbene l'oggetto restituito values()assomigli a un list, in alcuni casi non si comporta come uno. Ad esempio, non sarà json serializzabile a meno che non lo convertiamo in un `elenco '
Abhijit Ghate,

@AbhijitGhate buon punto, ho aggiornato la risposta per renderlo più chiaro.
Alasdair,

2
Puoi facilmente convertire il ritorno da values_listin un vero elenco Python semplicemente usando la listfunzione:list(Article.objects.values_list('comment_id', flat=True).distinct())
inostia,

55

valori()

Restituisce un QuerySet che restituisce dictionaries, anziché le istanze del modello, quando utilizzato come iterabile.

values_list ()

Restituisce un QuerySet che restituisce list of tuples, anziché le istanze del modello, quando utilizzato come iterabile.

distinti ()

distinti sono usati per gli eliminate the duplicateelementi.

Esempio:

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
Quindi è un elenco di dizionari che viene restituito in caso divalues
Hassan Baig,

Giusto per chiarire: distinct()elimina gli elementi duplicati dai risultati della query, non dal database.
oz19

5

Puoi ottenere i diversi valori con:

set(Article.objects.values_list('comment_id', flat=True))
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.