5.6 KiB
5.6 KiB
status, type, tags, created, updated, title, source
| status | type | tags | created | updated | title | source | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| processing | concept |
|
2026-05-30 | 2026-05-31 | Django: Модели и ORM |
|
Django Модели и ORM
Django ORM (Object-Relational Mapping) — технология связи объектно-ориентированного кода и реляционной БД. Реализует паттерн Active Record.
Структура проекта
manage.py: Утилита командной строки.settings.py: Конфигурация проекта (БД,INSTALLED_APPS).urls.py: Описание маршрутов.models.py: Определение таблиц БД.
Определение моделей
from django.db import models
class Person(models.Model):
first_name = models.CharField("Имя", max_length=30)
age = models.IntegerField(default=18)
bio = models.TextField(blank=True)
class Meta:
verbose_name = "Человек"
ordering = ["-first_name"]
Типы полей
AutoField— автоинкрементный числовой первичный ключ.CharField(max_length=N)— короткая строка фиксированной максимальной длины.TextField— длинный текст без обязательного ограничения длины.IntegerField— целое число.DecimalField(max_digits, decimal_places)— точное десятичное число, удобно для денег и измерений.BooleanField— логическое значениеTrue/False.DateField— дата без времени.DateTimeField— дата и время.EmailField— строка с валидацией email-адреса.FileField— путь к загруженному файлу.ImageField— файл изображения с дополнительной проверкой формата.
Отношения
ForeignKey(Target, on_delete=...)— связь «один ко многим»: у одной записиTargetможет быть много связанных записей текущей модели.OneToOneField(Target, on_delete=...)— связь «один к одному»: каждой записи соответствует максимум одна связанная запись.ManyToManyField(Target)— связь «многие ко многим»: записи обеих моделей могут ссылаться на несколько записей другой модели.
on_delete задаёт, что делать с текущей записью, если удаляется связанная запись Target:
CASCADE— удалить текущую запись вместе со связанной.PROTECT— запретить удаление связанной записи, пока на неё есть ссылки.SET_NULL— записатьNULLв поле связи; требуетnull=True.SET_DEFAULT— записать значение по умолчанию; требуетdefault.DO_NOTHING— ничего не делать на уровне Django, ответственность остаётся на БД и разработчике.
Миграции
Инструмент для синхронизации моделей с БД.
python manage.py makemigrations— создать файлы миграций.python manage.py migrate— применить изменения в БД.python manage.py showmigrations— список статусов миграций.
Работа с QuerySet (Запросы)
Django QuerySet ленивы (вычисляются только при обращении) и поддерживают цепочки методов.
Базовые CRUD операции
- Create:
obj = Person.objects.create(name="Ivan")илиobj.save(). - Read:
Person.objects.all()(все),Person.objects.get(id=1)(один),Person.objects.filter(age__gt=20)(фильтрация).
- Update:
Person.objects.filter(id=1).update(age=25). - Delete:
obj.delete()илиQuerySet.delete().
Поиск по полям (Field Lookups)
exact,iexact(регистронезависимо).gt(>),gte(>=),lt(<),lte(<=).contains,icontains.in(список),range(диапазон).isnull=True.
Оптимизация запросов
select_related('field'): INNER JOIN для ForeignKey и OneToOne.prefetch_related('field'): 2-й запрос для ManyToMany и обратных связей.- Проблема N+1: Возникает при обращении к связанным полям в цикле без предварительной подгрузки.
Агрегация и аннотация
aggregate(Avg('rating')): терминальный метод, возвращает словарь.annotate(total=Count('entries')): добавляет вычисляемое поле к каждому объекту в выборке.
Логические условия
Q-объекты: Позволяют использоватьOR(|),AND(&),NOT(~).F-выражения: Ссылки на поля в БД (атомарные операции без Race Condition).