Новое:Talanto осенью: фильтры с числами, отклик по шагам и каталог компаний

+1 199новых вакансий за сутки·93 838вакансий открыто сейчас·Новое:Talanto осенью: фильтры с числами, отклик по шагам и каталог компаний

Новые вакансии в TelegramРаботодателям
Talanto
Вакансии
Компании7 273
РезюмеAIПодготовкаСтатьи
BoostТарифыBoost
Войти

Не нашли подходящее?

Пусть нужная вакансия найдёт вас сама.

  1. Подборка в TelegramНовые вакансии по вашему фильтру — сразу в бота.Подключить
  2. Мэтчи по резюмеЗагрузите резюме — покажем, где вы подходите лучше всего.Загрузить
  3. Сохранить фильтрНастройте поиск один раз и возвращайтесь к новым вакансиям.Настроить
Что нового на TalantoTalanto осенью: фильтры с числами, отклик по шагам и каталог компаний

Для работодателей

Опубликуйте вакансию — отклики придут в ваш кабинет.

  1. Вакансиябесплатно
  2. Откликиконтакты бесплатно
  3. Наймэтапы и интервью

40 компаний публикуют вакансии напрямую · 4 409 кандидатов открыты к предложениям

Разместить вакансию

Популярные направления

Все подборки
  • Python17 222
  • Облачные технологии14 171
  • QA вакансии3 456
  • Backend вакансии2 114
  • Инженер данных1 801
  • Продакт-менеджер1 247

Разработка

  • Android1 858
  • iOS1 698
  • Fullstack вакансии997
  • AI вакансии955
  • Frontend вакансии755
  • Mobile вакансии44

По стеку

  • Go8 752
  • Java6 593
  • Node.js2 036
  • .NET1 739
  • Kotlin1 618
  • Rust1 472
  • C#717
  • PHP690
  • C++579

DevOps и инфраструктура

  • Kubernetes7 787
  • DevOps вакансии6 095
  • Linux-инфраструктура5 508
  • Terraform / IaC4 287
  • CI/CD3 272
  • Мониторинг и Observability1 792
  • SRE566
  • Кибербезопасность454

Аналитика и данные

  • Data Scientist1 138
  • Бизнес-аналитик921
  • Аналитик данных858
  • Системный аналитик154

Другие направления

  • Проджект-менеджер624
  • UI/UX дизайн149
  • Ручное тестирование14

По регионам

  • Вакансии в США44 166
  • Вакансии в Европе24 014
  • Вакансии в Канаде4 535
  • Работа в России3 867

По формату

  • Удалённые вакансии75 005
  • Релокация в США44 166
  • Гибридная работа12 485
  • Офисная работа7 090

По уровню

  • Senior вакансии42 643
  • Middle вакансии20 960
  • Junior вакансии6 708

Сейчас нанимают

Все компании
  • Wise190 вакансий
  • Rakuten189 вакансий
  • ASML166 вакансий
  • Grab137 вакансий
  • Celonis38 вакансий
  • Spotify37 вакансий
  • Adyen29 вакансий
  • Infobip28 вакансий
  • Monzo20 вакансий
  • Darktrace17 вакансий

Вакансии из 344 источников: карьерные страницы компаний и джоб-борды.

КомпанииО насНовостиПубличная офертаУсловия использованияПолитика конфиденциальностиПоддержка
←К теме DjangoВсе вопросы
DjangoMiddleТеория

Как оптимизировать запросы ORM Django — only(), defer(), values(), annotate()?

В закладки
Сначала попробуйте ответить сами30 секунд
Сравнить с ответом ↓

only()/defer() — загружают часть полей с инстансами модели; values()/values_list() — возвращают словари/кортежи без объектов; annotate() добавляет вычисляемые агрегаты прямо в SQL, избавляя от N+1 на подсчётах.

only() — загружать только указанные поля

Возвращает полноценные экземпляры модели, но с отложенной загрузкой остальных полей (Deferred Attributes). При доступе к отложенному полю Django выполнит дополнительный запрос.

from myapp.models import Article

# SELECT id, title FROM articles
articles = Article.objects.only("id", "title")

for a in articles:
    print(a.title)      # без доп. запроса
    print(a.body)       # ВНИМАНИЕ: новый запрос SELECT body FROM articles WHERE id=X

Используйте only() когда нужны объекты модели (например, для передачи в функции, ожидающие инстанс), но не все поля.

Оптимизация QuerySet в Django

Django ORM предоставляет несколько инструментов для сокращения объёма данных, передаваемых из БД: only(), defer(), values(), values_list() и annotate(). Каждый решает свою задачу.

defer() — исключить указанные поля

Инверсия only(): загружает все поля кроме перечисленных.

# SELECT id, title, status, published_at FROM articles (без body — большой TextFie d)
articles = Article.objects.defer("body")

for a in articles:
    print(a.title)  # без доп. запроса
    print(a.body)   # доп. запрос

defer() удобен, когда таблица имеет одно-два «тяжёлых» поля (TEXT, JSONB, BYTEA), которые не нужны в списочном представлении.

values() — словари вместо объектов модели

Возвращает ValuesQuerySet — итератор словарей. Нет накладных расходов на создание Python-объектов модели. Идеален для API и агрегаций.

# SELECT id, title FROM articles WHERE status='published'
articles = Article.objects.filter(status="published").values("id", "title")
# [{"id": 1, "title": "Hello"}, ...]

# Доступ к FK:
articles = Article.objects.values("id", "title", "author__name")
# SELECT articles.id, articles.title, authors.name FROM articles JOIN authors...

values_list() — кортежи или скалярные значения

# Список кортежей:
Article.objects.values_list("id", "title")
# [(1, "Hello"), (2, "World"), ...]

# Плоский список (flat=True, только одно поле):
ids = list(Article.objects.filter(status="published").values_list("id", flat=True))
# [1, 2, 3, ...]

# Именованные кортежи:
Article.objects.values_list("id", "title", named=True)

annotate() — вычисляемые поля в SQL

Добавляет агрегированные или вычисляемые значения прямо в QuerySet через SQL-функции. Избегает N+1 при подсчёте связанных объектов.

from django.db.models import Count, Avg, F, ExpressionWrapper, DurationField
from django.utils import timezone

# Количество комментариев к каждой статье
articles = (
    Article.objects
    .annotate(comment_count=Count("comments"))
    .order_by("-comment_count")
)
for a in articles:
    print(a.title, a.comment_count)

# Средний рейтинг по автору
from myapp.models import Author
authors = Author.objects.annotate(avg_rating=Avg("articles__rating"))

# Вычисление выражений через F и ExpressionWrapper
articles = Article.objects.annotate(
    age=ExpressionWrapper(
        timezone.now() - F("published_at"),
        output_field=DurationField()
    )
)

Сравнение подходов

  • only()/defer() — объекты модели, меньше полей. Риск N+1 при доступе к отложенным полям.
  • values()/values_list() — словари/кортежи, минимум памяти, нет методов модели.
  • annotate() — вычисления в SQL, устраняет N+1 для агрегаций.

Подводные камни

  • only() без select_related() для FK-поля создаёт N+1: поле id загружено, но при доступе к article.author Django делает отдельный запрос.
  • defer() на поле, используемое в order_by() или filter(), всё равно попадает в SQL — Django добавляет его автоматически.
  • values() возвращает FK как author_id (число), а не author (объект). Для доступа к полю связанной модели нужен author__name.
  • annotate(Count("comments")) с filter(comments__status="approved") создаст считаться только одобренных комментариев — это может быть неожиданным: используйте Count("comments", filter=Q(comments__status="approved")).
  • Несколько annotate(Count(...)) на разных M2M могут давать декартово произведение — разбивайте на отдельные подзапросы через Subquery.
  • values() + annotate() группирует по всем перечисленным полям values(), аналогично SQL GROUP BY.
  • Возвращаемые values()-словари не являются инстансами модели: методы модели, save(), сигналы — ничего из этого недоступно.

Типичные ошибки

  • Описывать queryset optimization только как термин и не показывать механизм на минимальном примере.
  • Игнорировать ошибки, пустые данные, конкурентный доступ или границы транзакции.
  • Не связывать поведение с официальным контрактом Django и реальной эксплуатацией.

Что проверяет интервьюер

  • Объясняет queryset optimization через последовательность действий, а не через набор ключевых слов.
  • Приводит короткий кодовый пример или production-сценарий с ожидаемым поведением.
  • Называет хотя бы один риск: производительность, безопасность, транзакции, память или сопровождение.

Как вы знаете этот вопрос?

Проверить себя по теме Django →

Источники

  • https://docs.djangoproject.com/en/5.2/ref/models/querysets/
  • https://docs.djangoproject.com/en/5.2/topics/db/optimization/

Связанные темы

Djangoapi-designdatabase-designtechnical-reasoning

Вакансии с этим навыком

  • Sr Software Engineer - Remote
  • Middle Python Developer
  • Staff Software Engineer
  • Software Engineer
  • Senior Software Engineer - Full Stack - Portal Platform

Частые вопросы на собеседовании

  • Как Django защищает от SQL-инъекций, CSRF и XSS-атак?
  • Как организовать настройки, secrets и environment-specific config без утечек?
  • Объясните жизненный цикл запроса/ответа в Django — от разрешения URL до HTTP-ответа.
  • Что такое проблема N+1 запросов в Django и как её обнаружить и исправить?