В Django, в чем разница между следующими двумя:

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

против

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

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

Ответы (4)

Метод values ​​() возвращает QuerySet, содержащий словари:


Метод values_list () возвращает QuerySet, содержащий кортежи:


Если вы используете values_list () с одним полем, вы можете использовать flat = True, чтобы вернуть QuerySet отдельных значений вместо 1-кортежей:


Вы можете получить разные значения с помощью:

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

значения ()

Возвращает QuerySet, который возвращает словари, а не экземпляры модели, когда используется в качестве итерируемого объекта.

список_значений ()

Returns a QuerySet that returns list of tuples, rather than model instances, when used as an iterable.

отдельный ()

разные используются для удаления повторяющихся элементов.

Пример:

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

Лучшее место, чтобы понять разницу, - это официальная документация по values ​​/ values_list. В нем много полезных примеров, и он очень ясно объясняет это. Документация django очень удобна для пользователей.

Вот небольшой фрагмент, чтобы порадовать рецензентов SO:

значения

Возвращает QuerySet, который возвращает словари, а не экземпляры модели, при использовании в качестве итерируемого.

И прочтите следующий за ним раздел:

список_значений

Это похоже на values ​​() за исключением того, что вместо возврата словарей он возвращает кортежи при повторении.

2022 WebDevInsider