Files
SecondBrain/90 Library/Programming/Python/Django: Модели и ORM.md
T
2026-05-30 19:03:22 +03:00

3.8 KiB


status: seed type: concept tags: [django, backend, orm, database, migrations] created: 2026-05-30 updated: 2026-05-30 title: Django: Модели и ORM source: ["lec1-django_start_models-1.pdf", "lec4-django_lec_queries.pdf", "p1-django-1.pdf"]

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, DateField, DateTimeField.
  • EmailField, FileField, ImageField.

Отношения

  • ForeignKey(Target, on_delete=models.CASCADE) — Один ко многим.
  • OneToOneField(Target, on_delete=models.CASCADE) — Один к одному.
  • ManyToManyField(Target) — Многие ко многим.
  • on_delete: CASCADE, PROTECT, SET_NULL, SET_DEFAULT, DO_NOTHING.

Миграции

Инструмент для синхронизации моделей с БД.

  • 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).