📖 Django Models — теоретическое введение

Library Project: схема базы данных

⚡ Модели Django — суть за 1 минуту

  • Модель = Python-класс → таблица в БД (1 класс = 1 таблица)
  • Поле = атрибут класса (CharField, IntegerField, DateField, ...)
  • Связи: ForeignKey (N:1), ManyToManyField (N:M), OneToOneField (1:1)
  • Миграции: makemigrations → создаёт файл, migrate → применяет к БД
  • Django сам создаёт поле id (автоинкремент PK), если не указано иное

Что такое Django ORM

Django ORM (Object-Relational Mapping) — это слой, который преобразует Python-классы в SQL-таблицы и обратно. Вы описываете структуру данных на Python, а Django автоматически генерирует SQL для создания таблиц, индексов и связей.

Принцип работы: Каждый класс, унаследованный от models.Model, становится таблицей в базе данных. Каждый атрибут-поле — это колонка.

Анатомия Django-модели

from django.db import models

class Author(models.Model):
    # Поля (колонки таблицы)
    first_name = models.CharField(max_length=100, verbose_name="Имя")
    last_name = models.CharField(max_length=100, verbose_name="Фамилия")
    birth_date = models.DateField(verbose_name="Дата рождения")

    class Meta:
        verbose_name = "Автор"
        verbose_name_plural = "Авторы"
        ordering = ['last_name']

    def __str__(self):
        return f"{self.first_name} {self.last_name[0]}."
  • Поля — атрибуты класса типа models.CharField, models.IntegerField и т.д.
  • Meta — внутренний класс с метаданными: читаемое имя, сортировка, уникальность
  • __str__ — строковое представление объекта в Django Admin и shell

Основные типы полей

ПолеSQL-типИспользование
CharField(max_length=N)VARCHAR(N)Строки ограниченной длины
TextField()TEXTДлинные тексты (описания, биографии)
IntegerField()INTEGERЦелые числа
FloatField()REALДробные числа (рейтинги)
BooleanField()BOOLEANTrue/False флаги
DateField()DATEТолько дата
DateTimeField()DATETIMEДата и время
EmailField()VARCHAR(254)Email с валидацией формата
URLField()VARCHAR(200)URL с валидацией

Параметры полей

ПараметрПо умолчаниюЗначение
null=TrueFalseРазрешить NULL в БД
blank=TrueFalseРазрешить пустое значение в форме/API
default=...Значение по умолчанию
unique=TrueFalseУникальное значение в таблице
choices=[...]Список допустимых значений
verbose_name="..."имя атрибутаЧитаемое имя поля в Admin
help_text="..."Подсказка к полю в Admin

Типы связей между моделями

ForeignKey — один ко многим (N:1)

Один автор может написать много книг. Каждая книга имеет одного автора.

class Book(models.Model):
    author = models.ForeignKey(
        Author,
        on_delete=models.SET_NULL,  # что делать при удалении автора
        null=True,
        related_name='books'  # author.books.all() — обратный доступ
    )
Параметр on_delete — обязателен!
CASCADE — удалить связанные объекты вместе.
SET_NULL — поставить NULL (нужен null=True).
PROTECT — запретить удаление, пока есть связанные объекты.
SET_DEFAULT — поставить значение по умолчанию.

ManyToManyField — многие ко многим (N:M)

Одна библиотека содержит много книг. Одна книга может быть в нескольких библиотеках.

class Book(models.Model):
    libraries = models.ManyToManyField(
        'Library',
        related_name='books'  # library.books.all() и book.libraries.all()
    )
Django автоматически создаёт промежуточную таблицу app_book_libraries. Вам не нужно её описывать вручную для базовых случаев.

OneToOneField — один к одному (1:1)

Каждый автор имеет ровно одну запись с детальной информацией.

class AuthorDetail(models.Model):
    author = models.OneToOneField(
        Author,
        on_delete=models.CASCADE,
        related_name='details'  # author.details — доступ к деталям
    )
    biography = models.TextField()

Валидаторы полей

from django.core.validators import MinValueValidator, MaxValueValidator

class Author(models.Model):
    rating = models.IntegerField(
        default=1,
        validators=[MinValueValidator(1), MaxValueValidator(10)]
    )
Валидаторы Django выполняются при вызове full_clean() и через Django Forms/Admin. При прямом создании объекта через Author(rating=999) в shell они не выполняются автоматически. ⚠️ Проверить по документации

Choices (выборы)

GENRE_CHOICES = [
    ('Fiction', 'Художественная'),
    ('Non-Fiction', 'Документальная'),
    ('Science Fiction', 'Научная фантастика'),
    ('Fantasy', 'Фэнтези'),
    ('Mystery', 'Детектив'),
    ('Biography', 'Биография'),
]

class Book(models.Model):
    genre = models.CharField(max_length=50, null=True, choices=GENRE_CHOICES)

Первый элемент кортежа — значение в БД, второй — читаемое название в Admin/формах.

Миграции

Миграции — это способ синхронизировать структуру моделей Python с реальной базой данных.

  1. Описать/изменить модель в models.py
  2. python manage.py makemigrations — Django анализирует изменения и создаёт файл миграции в папке migrations/
  3. python manage.py migrate — применить миграции к БД (выполнить SQL)
# Посмотреть SQL, который будет выполнен:
python manage.py sqlmigrate library 0001

# Список всех миграций и их статус:
python manage.py showmigrations

Регистрация в Django Admin

# library/admin.py
from django.contrib import admin
from .models import Author, Book

admin.site.register(Author)
admin.site.register(Book)

# Или с настройками:
@admin.register(Author)
class AuthorAdmin(admin.ModelAdmin):
    list_display = ('first_name', 'last_name', 'birth_date')
    search_fields = ('first_name', 'last_name')