1. Регистрация моделей в Admin
Из лекции (старое)
# admin.py
from django.contrib import admin
from .models import Category, Product
admin.site.register(Category)
admin.site.register(Product)
# Или с классом:
class CategoryAdmin(admin.ModelAdmin):
list_display = ['name']
admin.site.register(Category, CategoryAdmin)
Современное (Django 3+)
# admin.py
from django.contrib import admin
from .models import Category, Product
@admin.register(Category)
class CategoryAdmin(admin.ModelAdmin):
list_display = ['name']
search_fields = ['name']
@admin.register(Product)
class ProductAdmin(admin.ModelAdmin):
list_display = ['name', 'price']
Оба способа работают в Django 5.x. Декоратор
@admin.register является предпочтительным — он связывает класс и модель в одном месте, код читается лучше.
2. PositiveIntegerField vs PositiveSmallIntegerField
Из лекции (старое)
# Иногда использовали обычный IntegerField
# или PositiveIntegerField без разбора
quantity = models.IntegerField()
# или
quantity = models.PositiveIntegerField()
Современное
# Для небольших количеств (до 32767):
quantity = models.PositiveSmallIntegerField()
# Занимает 2 байта в PostgreSQL vs 4 байта
# Для больших значений:
quantity = models.PositiveIntegerField()
# До 2 147 483 647
3. unique_together vs UniqueConstraint
Из лекции (устарело)
class Meta:
unique_together = (('name', 'city'),)
# Работает, но помечено deprecated
# в Django 4.x
Современное (Django 4+)
from django.db.models import UniqueConstraint
class Meta:
constraints = [
UniqueConstraint(
fields=['name', 'city'],
name='unique_name_city'
)
]
⚠️ Проверить по документации:
unique_together ещё поддерживается в Django 5.x, но помечено как устаревшее. Для новых проектов рекомендуется UniqueConstraint в Meta.constraints.
4. db_index на уникальном поле (избыточность)
В лекции (избыточно, но корректно)
article = models.CharField(
max_length=100,
unique=True,
db_index=True # ИЗБЫТОЧНО: unique уже создаёт индекс
)
Современное (достаточно)
article = models.CharField(
max_length=100,
unique=True
# db_index не нужен: unique автоматически
# создаёт UNIQUE INDEX в БД
)
В практикуме задание явно требует
db_index=True вместе с unique=True. Следуйте заданию — Django не выдаёт ошибку, просто создаёт индекс, который уже существует, и предупреждает об избыточности.
5. verbose_name_plural — английский vs русский
В лекции (английские значения)
class Meta:
verbose_name_plural = 'categories'
# Англоязычный проект — нормально
Для русскоязычного проекта
class Meta:
verbose_name = 'Категория'
verbose_name_plural = 'Категории'
# Admin будет отображать по-русски