Метод values_list
Метод values_list применяется к QuerySet и возвращает
новый QuerySet, который содержит кортежи с значениями
указанных полей модели. В отличие от метода values,
который возвращает словари, values_list возвращает
кортежи, что позволяет экономить память и ускоряет
обработку данных при работе с большими наборами записей.
Метод принимает имена полей в качестве аргументов
и может быть использован для извлечения конкретных
данных из базы данных без создания экземпляров моделей.
Синтаксис
Model.objects.values_list(*fields, flat=False, named=False)
Пример . С одним полем
Получим список названий всех статей:
from myapp.models import Article
titles = Article.objects.values_list('title')
for title in titles:
print(title)
Результат выполнения кода:
("Article 1",)
("Article 2",)
("Article 3",)
Пример . С параметром flat
Для получения плоского списка значений при выборке
одного поля используйте параметр flat=True:
from myapp.models import Article
titles = Article.objects.values_list('title', flat=True)
for title in titles:
print(title)
Результат выполнения кода:
"Article 1"
"Article 2"
"Article 3"
Пример . С несколькими полями
Получим кортежи с названиями и статусами статей:
from myapp.models import Article
articles_data = Article.objects.values_list('title', 'status')
for title, status in articles_data:
print(f"Title: {title}, Status: {status}")
Результат выполнения кода:
"Title: Article 1, Status: published"
"Title: Article 2, Status: draft"
"Title: Article 3, Status: published"
Пример . С named=True
Используйте параметр named=True для получения
именованных кортежей, что упрощает доступ к полям
по имени:
from myapp.models import Article
articles = Article.objects.values_list('title', 'status', named=True)
for article in articles:
print(article.title, article.status)
Результат выполнения кода:
"Article 1 published"
"Article 2 draft"
"Article 3 published"
Пример . С полями связанной модели
Метод values_list поддерживает обращение
к полям связанных моделей через двойное подчеркивание:
from myapp.models import Article
article_users = Article.objects.values_list('title', 'author__username')
for title, username in article_users:
print(f"Article: {title}, Author: {username}")
Результат выполнения кода:
"Article: Article 1, Author: john_doe"
"Article: Article 2, Author: jane_smith"
"Article: Article 3, Author: john_doe"
Пример . С фильтрацией
Метод values_list можно комбинировать
с методом filter для выборки конкретных данных:
from myapp.models import Article
published_titles = Article.objects.filter(status='published').values_list('title', flat=True)
for title in published_titles:
print(title)
Результат выполнения кода:
"Article 1"
"Article 3"