⚖️ Старый vs Новый: устаревшие паттерны

⚡ Главные изменения

  • unique_togetherUniqueConstraint в constraints
  • admin.site.register()@admin.register()
  • Оба старых паттерна всё ещё работают, но помечены как deprecated
Пояснение: ниже — паттерны, которые показывались в лекции как актуальные на момент записи, и их современные эквиваленты для Django 5.x. Старый код работает, но вызывает предупреждения или считается не best-practice.

1. unique_together → UniqueConstraint

Из лекции (старое)

class Meta:
    unique_together = ('title', 'author')

Проблемы:

  • Атрибут помечен как deprecated в Django 4.2
  • Менее гибкий: нельзя задать имя ограничения, условие, включение NULL
  • Принимает только кортеж полей

Современное (Django 5.x)

from django.db.models import UniqueConstraint

class Meta:
    constraints = [
        UniqueConstraint(
            fields=['title', 'author'],
            name='unique_title_author'
        ),
    ]

Преимущества:

  • Явное именование ограничения
  • Поддержка condition= для частичных ограничений
  • Поддержка nulls_distinct= (Django 5.0+)

2. admin.site.register() → @admin.register()

Из лекции (традиционный)

from django.contrib import admin
from .models import Book

class BookAdmin(admin.ModelAdmin):
    list_display = ('title', 'author')
    list_per_page = 25

admin.site.register(Book, BookAdmin)

Заметки:

  • Работает, не deprecated
  • Класс и регистрация разделены — менее наглядно
  • При большом количестве моделей код становится длиннее

Современное (рекомендуется)

from django.contrib import admin
from .models import Book

@admin.register(Book)
class BookAdmin(admin.ModelAdmin):
    list_display = ('title', 'author')
    list_per_page = 25

Преимущества:

  • Декоратор явно показывает: класс — настройки для Book
  • Более компактный и читаемый код
  • Можно регистрировать несколько моделей: @admin.register(Book, Author)

3. fields → fieldsets (для сложных форм)

Простой вариант из лекции

class BookAdmin(admin.ModelAdmin):
    fields = ('author', 'title',
              'published_date')

Подходит для простых форм, все поля в одной группе.

Расширенный: fieldsets

class BookAdmin(admin.ModelAdmin):
    fieldsets = [
        ('Основная информация', {
            'fields': ('title', 'author')
        }),
        ('Дата публикации', {
            'fields': ('published_date',),
            'classes': ('collapse',),
        }),
    ]

Группирует поля по секциям, поддерживает collapse.

4. Обычный register → Inline (для связанных моделей)

Без inline (из лекции)

# Раздельная регистрация
@admin.register(Author)
class AuthorAdmin(admin.ModelAdmin):
    list_display = ('name',)

@admin.register(Book)
class BookAdmin(admin.ModelAdmin):
    list_display = ('title', 'author')

Управлять Book и Author можно только раздельно.

С TabularInline (Django 5.x)

class BookInline(admin.TabularInline):
    model = Book
    extra = 1

@admin.register(Author)
class AuthorAdmin(admin.ModelAdmin):
    list_display = ('name',)
    inlines = [BookInline]

Книги отображаются прямо в форме редактирования автора.

⚠️ Проверить по документации: TabularInline и StackedInline — подробности в django.contrib.admin.