Выбор ответа Junior Django ORM и N+1 обновлено
values_list(flat=True)
Вопрос
Что вернёт User.objects.filter(is_active=True).values_list("email", flat=True)?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: QuerySet строк-email без создания объектов моделей. valueslist с одним полем и flat=True даёт плоскую последовательность значений.
Варианты ответа
- QuerySet строк-email без создания объектов моделейправильный ответ
- Список объектов
Userс загруженным полем email - Словари вида
{"email": ...}для каждого пользователя - Одну строку со всеми email через запятую для рассылки
Разбор
values_list с одним полем и flat=True даёт плоскую последовательность значений. Модели не создаются, поэтому это быстрее и экономнее, когда нужны только значения, например для рассылки. Словари возвращает values(). Результат по-прежнему ленивый QuerySet, а не готовый список.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Ещё по теме «Django ORM и N+1»
- Задвоение сумм при нескольких annotate
- Посчитать SQL-запросы при ленивой загрузке
- Как prefetch_related склеивает данные
- exists() и count() вместо загрузки строк
- Атомарное увеличение счётчика
- Prefetch с вложенным select_related
- transaction.atomic
- Когда выполняется QuerySet