Django появился за 10 лет до того, как в Python стандартизировали аннотации типов, поэтому подружить их — задача не из легких.
Вот краткий срез того, как обстоят дела сегодня:
1️⃣ Золотой стандарт: django-stubs + mypy
Если вам нужна максимальная точность, это ваш выбор. Пакет поставляется с плагином для
mypy, который «разбирает» динамическую магию Django.Минус: Это медленно. Очень. На больших проектах
mypy может работать минуты, что делает его неудобным для использования прямо в редакторе кода. Часто его оставляют только для CI.2️⃣ Быстрые альтернативы: Pyright, Ty, Pyrefly
Эти чекеры работают за секунды, но не поддерживают плагины
mypy. Итог — куча ложных срабатываний (false positives).Типичная ошибка: Чекер не видит поле
.id или связанные имена (related names).Лайфхак: Вместо
.id используйте .pk — инструменты обычно понимают его лучше. Или же явно определяйте id = models.AutoField(primary_key=True) в модели.3️⃣ Новый подход: Django-Mantle
Интересная библиотека, которая предлагает вообще не работать с динамическими типами моделей напрямую. Вместо этого вы описываете
attrs`-классы и используете их как типизированные DTO для данных из БД. Если логика работает с `BookmarkAttrs, а не с Bookmark(models.Model), проблем с типами не будет.4️⃣ Проблема версий
Сторонние библиотеки типов (django-stubs/django-types) часто отстают от релизов Django. Например, Django 6.0 вышла 3 месяца назад, а полной поддержки типов для неё всё ещё нет.
Хорошие новости: управляющий совет Django одобрил внедрение типов в само ядро фреймворка! Также есть надежда на PEP-0827, который может добавить в Python новые возможности для типизации динамических структур без специальных плагинов.
🔛 Полный пост
