🔖 Справочник: Django поля и Admin

Быстрая шпаргалка для практикума 5

⚡ Быстрая шпаргалка

# Типы полей практикума
CharField(max_length=N, unique=True)
EmailField(unique=True)
DecimalField(max_digits=10, decimal_places=2)
PositiveSmallIntegerField()
BooleanField(default=True)
DateField(null=True, blank=True)
DateTimeField(auto_now_add=True)
TextField(null=True, blank=True)

# Связи
ForeignKey(Model, on_delete=models.PROTECT, related_name='...')
OneToOneField(Model, on_delete=models.CASCADE, related_name='...')
OneToOneField(Model, null=True, on_delete=models.SET_NULL, related_name='...')

# Admin
@admin.register(Model)
class ModelAdmin(admin.ModelAdmin):
    list_display = ['field1', 'field2']
    search_fields = ['field1']
    list_filter = ['field1']
    ordering = ['field1']
    list_editable = ['field2']  # поле должно быть в list_display!

Команды manage.py (раздел 1)

# Клонирование и настройка
git clone <URL>
cd <project-dir>
python -m venv venv
venv\Scripts\activate          # Windows
source venv/bin/activate       # macOS/Linux
pip install -r requirements.txt

# Миграции
python manage.py migrate
python manage.py makemigrations <app>  # после изменения models.py
python manage.py migrate

# Запуск
python manage.py runserver

Типы полей практикума

Поле Назначение Ключевые параметры
CharField Строка ограниченной длины max_length, unique
EmailField Email с валидацией формата unique
TextField Длинный текст null=True, blank=True
DecimalField Точное десятичное число max_digits, decimal_places
PositiveSmallIntegerField Небольшое положительное целое (0–32767)
BooleanField True/False default
DateField Только дата null=True, blank=True
DateTimeField Дата и время auto_now_add=True, null=True

Связи и on_delete

# ForeignKey — много-к-одному
category = models.ForeignKey(
    Category,
    on_delete=models.PROTECT,    # нельзя удалить Category, пока есть Product
    related_name='products'      # Category.products.all()
)

# OneToOneField — один-к-одному (CASCADE — удалить вместе)
product = models.OneToOneField(
    Product,
    on_delete=models.CASCADE,
    related_name='details'       # Product.details
)

# OneToOneField — один-к-одному (SET_NULL — обнулить)
address = models.OneToOneField(
    Address,
    null=True,
    on_delete=models.SET_NULL,
    related_name='customer'
)

Атрибуты ModelAdmin

Атрибут Назначение
list_display Колонки в списке объектов
search_fields Поля для поиска (LIKE-запрос)
list_filter Боковая панель фильтров
ordering Сортировка в Admin-списке
list_editable Редактировать прямо в списке (требует наличия в list_display)

Поиск по связанным полям в search_fields

# Двойное подчёркивание для обращения к связанной модели
search_fields = (
    'customer__first_name',  # Order → Customer.first_name
    'customer__last_name',
    'customer__email',
)