⚖️ Старый vs Новый подход

Устаревшие паттерны из лекции vs современный Django 5.x

⚡ Главные отличия

  • Регистрация в Admin: admin.site.register(Model, Admin)@admin.register(Model)
  • PositiveIntegerField: до Django 4.1 устарело, сейчас PositiveSmallIntegerField для малых значений
  • unique_together: устарело → UniqueConstraint в Meta.constraints
  • db_index на уникальном поле: избыточно, но допустимо

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 будет отображать по-русски