Что такое 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() | BOOLEAN | True/False флаги |
DateField() | DATE | Только дата |
DateTimeField() | DATETIME | Дата и время |
EmailField() | VARCHAR(254) | Email с валидацией формата |
URLField() | VARCHAR(200) | URL с валидацией |
Параметры полей
| Параметр | По умолчанию | Значение |
|---|---|---|
null=True | False | Разрешить NULL в БД |
blank=True | False | Разрешить пустое значение в форме/API |
default=... | — | Значение по умолчанию |
unique=True | False | Уникальное значение в таблице |
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 с реальной базой данных.
- Описать/изменить модель в
models.py python manage.py makemigrations— Django анализирует изменения и создаёт файл миграции в папкеmigrations/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')