Пояснение: ниже — паттерны, которые показывались в лекции как актуальные на момент записи, и их современные эквиваленты для 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.