⚖️ Старый vs Новый стиль Django

🎯 Модернизация паттернов К оглавлению урока

Ниже показаны устаревшие паттерны из лекции и их современные аналоги на Django 5.x. В основном тексте курса используется только современный стиль.

1. Регистрация приложения в INSTALLED_APPS

Из лекции (старое)Современное (Django 3.2+)
# settings.py — только имя модуля
INSTALLED_APPS = [
    ...
    'myapp',
]
# settings.py — явный конфигурационный класс
INSTALLED_APPS = [
    ...
    'myapp.apps.MyappConfig',
]

Почему изменилось: явное указание AppConfig позволяет корректно работать сигналам, переопределять verbose_name приложения и управлять загрузкой.

2. Тип первичного ключа по умолчанию

Из лекции (старое — Django до 3.2)Современное (Django 3.2+)
# AutoField — 32-bit int (до ~2 млрд записей)
# Устанавливался по умолчанию автоматически
# settings.py
DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
# BigAutoField — 64-bit int (до 9 * 10^18 записей)

Почему изменилось: BigAutoField стал дефолтом с Django 3.2 — защита от переполнения id в больших проектах.

3. NullBooleanField (устарело)

Из лекции (старое)Современное (Django 4.0+)
# NullBooleanField — хранит True/False/NULL
# Устарело в Django 4.0, удалено в 5.0
is_active = models.NullBooleanField()
# BooleanField с null=True
is_active = models.BooleanField(null=True)

4. Хранение SECRET_KEY

Из лекции (упрощённо — только для учёбы)Правильный подход (продакшн)
# settings.py — НЕБЕЗОПАСНО
SECRET_KEY = 'django-insecure-abc123...'
# .env
SECRET_KEY=your-real-secret-key

# settings.py
import environ
env = environ.Env()
environ.Env.read_env(BASE_DIR / '.env')
SECRET_KEY = env('SECRET_KEY')

Правило: SECRET_KEY никогда не должен находиться в системе контроля версий. Для локальной разработки используйте .env (который добавлен в .gitignore).

5. Простая регистрация моделей в admin vs ModelAdmin

Из лекции (базовое)Рекомендуемый подход
# admin.py — минимально
from django.contrib import admin
from .models import Book
admin.site.register(Book)
# admin.py — с настройкой через декоратор
from django.contrib import admin
from .models import Book

@admin.register(Book)
class BookAdmin(admin.ModelAdmin):
    list_display = ['title', 'author', 'published_date']
    search_fields = ['title', 'author__name']
    list_filter = ['published_date']
    ordering = ['-published_date']

Почему лучше: декоратор @admin.register — более Pythonic стиль, читаемее. Явный ModelAdmin позволяет полностью кастомизировать отображение.

6. Настройки DATABASES — SQLite vs PostgreSQL

Лекция (разработка)Продакшн (PostgreSQL)
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',
    }
}
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': env('DB_NAME'),
        'USER': env('DB_USER'),
        'PASSWORD': env('DB_PASSWORD'),
        'HOST': env('DB_HOST', default='localhost'),
        'PORT': env('DB_PORT', default='5432'),
    }
}
# pip install psycopg2-binary