РекомендуетсяDjango 5.2Python

Django: приложения, имена и безопасная инициализация

Оформляйте предметную область как Django application с устойчивым именем, URL namespace и миграциями. При импорте модулей и в AppConfig.ready не выполняйте бизнес-записи и запросы к БД.

Опубликовано Проверено Изменено

Плохо

# orders/apps.py
from django.apps import AppConfig
from .models import Order
 
class OrdersConfig(AppConfig):
    name = "orders"
    def ready(self):
        Order.objects.filter(status="new").update(status="sent")

Хорошо

# orders/apps.py
from django.apps import AppConfig
 
class OrdersConfig(AppConfig):
    default_auto_field = "django.db.models.BigAutoField"
    name = "orders"
 
# settings.py: INSTALLED_APPS содержит "orders.apps.OrdersConfig".
# orders/urls.py:
# app_name = "orders"
# urlpatterns = [path("<int:pk>/", views.detail, name="detail")]
# Миграции приложения хранятся в orders/migrations/.

Почему это важно

App registry и management commands инициализируют приложение в разных условиях, в том числе до миграций. Запрос или запись при startup может обращаться к неподготовленной БД и повторяться при каждом процессе.

Когда применять

Django 5.2, Python-версия из поддерживаемого профиля проекта. Имена Python-пакетов и функций — snake_case, классов — CapWords по принятому Python-стилю. Это соглашения проекта/Python, а имена models.py, apps.py и AppConfig.name связаны с механизмами Django.

Разделяйте project configuration и приложения предметных областей; небольшой application не обязан иметь service/repository слой. models описывают данные, views — HTTP-адаптер, urls — маршруты, templates — представление. Если models разделены по файлам, их обнаружение и импорт остаются явными.

AppConfig.name — полный Python-путь, label должен быть уникальным и устойчивым: его изменение после миграций затрагивает ссылки Django. Не переименовывайте label как косметическую правку. Для URL используйте именованные маршруты и app_name там, где возможны совпадения.

В ready допустима регистрация signals при необходимости, но она должна быть безопасна к повторной инициализации; не используйте signal как невидимый универсальный слой бизнес-процесса. DB-операция выполняется в явном request/service/management command, а связанные записи подчиняются atomic-контракту.

Кто что делает

Человек

Определяет границы приложений и устойчивые имена, согласует изменения labels.

AI-агент

Проверяет чистый startup, AppConfig и миграции. Не выполняет данные/внешние эффекты из ready или module import.

Как проверить у себя

Вход и действиеОжидаемый результатСвидетельство
Новая БД, check/migrate и запускStartup не требует уже созданных таблиц приложенияЛог чистой установки
Два приложения имеют detail routereverse с namespace выбирает нужный URLТест маршрутизации
Повторная инициализация приложения/несколько workerНет повторных записей и дубликатов signalsСчетчик вызовов
Предложено переименование app labelПроверены зависимости миграций и обратная совместимостьПлан миграции, не массовая замена строки

Проверка импорта Python без Django registry не доказывает корректную загрузку application.

ПервоисточникиИстория изменений на GitHub

Дата проверки отражает содержательную сверку. Синхронизация сайта не обновляет её автоматически.