Разница между values и values_list в Django
Быстрый ответ
Для получения списка словарей, в котором названия полей являются ключами, используйте values():
# Получаем словари с названиями полей в качестве ключей
dicts = MyModel.objects.values('id', 'name')
Если вас интересует производительность, то предпочтительнее values_list(). Он возвращает список кортежей. Добавьте параметр flat=True, чтобы получить одномерный список:
# Имеем список кортежей с полями (id, name)
tuples = MyModel.objects.values_list('id', 'name')
# Получаем одномерный список id
ids = MyModel.objects.values_list('id', flat=True)
Основное правило: выбирайте values(), если требуется доступ к значениям по названию поля; применяйте values_list() для более эффективной работы со значениями.

Стратегический подход
Выбор между values и values_list определяется требуемым форматом данных и необходимостью производительности.
values()возвращает словари с данными, что упрощает работу с ними за счет обращения к значениям по ключам.values_list()обладает высокой производительностью и идеально подходит для операций непосредственно с данными, например, при создании уникальных наборов с помощьюset().
Когда использовать каждый метод
Подробнее о values()
values() отлично справляется, когда требуется исследование данных:
- Гибкость: доступ к элементам по названиям полей позволяет удобно организовывать код.
- Манипуляции с данными: словари упрощают выполнение различных операций обработки данных.
Эффективное использование ресурсов с values_list()
Если важна скорость, то выбор в пользу values_list() будет оптимальным:
- Производительность: этот метод быстрее за счет минимизации деталей.
- Экономия памяти: важный параметр при обработке больших объемов данных.
Сочетание с distinct()
Чтобы извлечь уникальные значения, используйте distinct():
values('field').distinct(): возвращает уникальные словари по указанному полю.values_list('field', flat=True).distinct(): производит выборку уникальных значений по полю в виде списков.
Визуализация
values_listпредоставляет точный список данных, минималистичный и практичный подход.
# Берем продукты: '🍎', '🍌', '🍇'
shopping_list = Grocery.objects.values_list('produce', flat=True)
valuesобеспечивает широкое представление данных, удобный ответ на запросы разного рода.
# Получаем детализацию продуктов: {'produce': '🍎', 'quantity': 5, 'notes': 'Выбирайте спелые!'}
shopping_list = Grocery.objects.values('produce', 'quantity', 'notes')
Суть вкратце: values_list — это быстрый подход, тогда как values описывает полную ситуацию.
Что стоит помнить
Подготовка данных для перевода в формат JSON
Если требуется преобразование данных в формат JSON, наиболее удобным будет values(), так как словари легко переводятся в этот формат. Однако, values_list также можно преобразовать в словари при помощи list comprehension, если в этом возникает потребность.
Типы полей и трансформации
- Работа с одним полем: если требуется получить результат по одному полю, используйте
values_list('field', flat=True)для более эффективной работы. - Трансформация данных: С помощью
valuesможно применять аннотации и функции к полям прямо в запросе.
Распространенные ошибки и ограничения
Есть некоторые моменты, на которые стоит обратить внимание:
- Использование
flat=Trueс несколькими полями вызовет ошибку TypeError, поскольку этот параметр допускается только с одним полем. - Кортежи, возвращаемые
values_list(), неизменяемы, в отличие от словарей, получаемых черезvalues().
Работа с наборами данных и цепными вызовами методов
Удаление дубликатов
Для удаления дубликатов можно использовать set():
# Удаляем дубликаты
unique_values = set(MyModel.objects.values_list('field', flat=True))
Цепочка вызовов
values и values_list могут эффективно использоваться в цепочках вызовов:
# Выполняют каждую вашу команду подряд
chained = MyModel.objects.values('field').filter(condition).order_by('field')
Полезные материалы
- Документация QuerySet API | Django Documentation | Django — официальная документация Django по методу
values_list(). - Документация QuerySet API | Django Documentation | Django — подробное руководство по методу
values()от авторитетного источника. - Агрегирование данных | Django Documentation | Django — продвинутые методы работы с аннотациями и агрегацией данных в
values().


