Django values_list vs values


146

У Django, яка різниця між цими наступними:

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

проти

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

Моя мета - отримати список унікальних ідентифікаційних коментарів під кожним Article. Я прочитав документацію (і фактично використав обидва підходи). Результати відверто здаються схожими.


За допомогою values_list ви можете користуватися, if self.id in Article.objects.values_list('comment_id', flat=True):використовуючи значення, які вам потрібні для доступу до словника
dnaranjo

1
@dnaranjo - Ти міг, але чому б не просто так зробити Article.objects.filter(comment_id=self.id).exists()?
Сайсе

1
Це відповідь на інше запитання
dnaranjo

Відповіді:


250

values()Метод повертає QuerySet , що містять словники:

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

values_list()Метод повертає QuerySet , що містять кортежі:

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

Якщо ви використовуєте values_list()одне поле, ви можете використовувати flat=Trueдля повернення QuerySet з одних значень замість 1-кортежів:

<QuerySet [1, 2]>

О, і немає різниці між двома по відношенню до того, як distinct()застосовується так?
Хассан Байг

2
Ні, я не думаю, що distinct()працює інакше. Важливо те, з якою структурою даних ви хочете працювати.
Alasdair

3
У values()повертає QuerySetі не є list. Хоча об'єкт, що повертається, values()виглядає як a list, в деяких випадках він не поводиться як один. Наприклад, це не буде серіалізацією json, якщо ми не перетворимо його у `список '
Abhijit Ghate

@AbhijitGhate Добре, я оновив відповідь, щоб зробити це зрозумілішим.
Alasdair

2
Ви можете легко конвертувати повернення з values_listсправжнього списку Python, просто скориставшись listфункцією:list(Article.objects.values_list('comment_id', flat=True).distinct())
inostia

55

значення ()

Повертає 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}]

2
Отже, це список словників, які повертаються у випадкуvalues
Хассан Байг

Просто для уточнення: distinct()виключає повторювані елементи з результатів запитів, а не з бази даних.
oz19

5

Ви можете отримати різні значення за допомогою:

set(Article.objects.values_list('comment_id', flat=True))
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.