← Назад к вопросам

Какие методы используются в Django для CRUD?

1.3 Junior🔥 201 комментариев
#Django

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

CRUD методы в Django

CRUD обозначает четыре основные операции: Create (создание), Read (чтение), Update (обновление), Delete (удаление).

1. CREATE (создание записей)

Способ 1: Прямая инстанциация и save()

from django.db import models

class User(models.Model):
    name = models.CharField(max_length=100)
    email = models.EmailField()

# Способ 1
user = User(name="John", email="john@example.com")
user.save()

# Способ 2 - более короткий
User.objects.create(name="John", email="john@example.com")

Способ 2: Bulk create для многих записей

users = [
    User(name="John", email="john@example.com"),
    User(name="Jane", email="jane@example.com"),
    User(name="Bob", email="bob@example.com"),
]
User.objects.bulk_create(users, batch_size=100)

bulk_create быстрее при создании много записей (один запрос вместо трёх).

2. READ (чтение записей)

Получить одну запись

# По primary key
user = User.objects.get(id=1)  # Если нет - исключение

# Если может не быть
user = User.objects.filter(id=1).first()

# Если может не быть - с default
user = User.objects.get(id=1) if User.objects.filter(id=1).exists() else None

# Альтернатива get_object_or_404
from django.shortcuts import get_object_or_404
user = get_object_or_404(User, id=1)  # 404 если нет

Получить все записи

# Все пользователи
users = User.objects.all()

# С фильтром
users = User.objects.filter(name="John")

# С исключением
users = User.objects.exclude(name="John")

# С условиями
from django.db.models import Q
users = User.objects.filter(
    Q(name="John") | Q(email="john@example.com")
)

Сортировка

# По возрастанию
users = User.objects.all().order_by("name")

# По убыванию
users = User.objects.all().order_by("-created_at")

# По нескольким полям
users = User.objects.all().order_by("name", "-created_at")

Ограничение результатов

# Первые 10
users = User.objects.all()[:10]

# С offset
users = User.objects.all()[10:20]

# Только count
count = User.objects.count()

# Одна запись или None
user = User.objects.filter(email="john@example.com").first()
user = User.objects.filter(email="john@example.com").last()

3. UPDATE (обновление записей)

Обновить одну запись

# Способ 1: изменить и save()
user = User.objects.get(id=1)
user.name = "Jane"
user.save()

# Способ 2: save() с определёнными полями
user.name = "Jane"
user.save(update_fields=["name"])  # Обновляет только name

# Способ 3: update() queryset
User.objects.filter(id=1).update(name="Jane")

Обновить много записей

# Одним запросом в БД
User.objects.filter(email__contains="@example.com").update(
    status="active"
)
update() быстрее для массовых обновлений (один SQL запрос).

Обновить с F() выражениями

from django.db.models import F

# Увеличить количество постов на 1
User.objects.filter(id=1).update(
    post_count=F("post_count") + 1
)

# Это безопаснее, чем:
user = User.objects.get(id=1)
user.post_count += 1
user.save()  # При race condition может быть проблема

4. DELETE (удаление записей)

Удалить одну запись

# Способ 1: delete() на объекте
user = User.objects.get(id=1)
user.delete()

# Способ 2: delete() на queryset
User.objects.filter(id=1).delete()

Удалить много записей

# Все неактивные пользователи
User.objects.filter(status="inactive").delete()

# Все пользователи (ОСТОРОЖНО!)
User.objects.all().delete()
delete() на queryset вызывает SQL DELETE, что быстрее.

Django ORM методы по категориям

Фильтрация и поиск

User.objects.filter(name="John")          # Точное совпадение
User.objects.filter(name__iexact="john")  # Без учёта регистра
User.objects.filter(name__contains="Jo")  # Содержит
User.objects.filter(age__gte=18)          # Больше или равно
User.objects.filter(age__lte=65)          # Меньше или равно
User.objects.filter(age__gt=18)           # Больше
User.objects.filter(age__lt=65)           # Меньше
User.objects.filter(id__in=[1, 2, 3])     # В списке
User.objects.filter(status__isnull=True)  # NULL

Агрегация

from django.db.models import Count, Sum, Avg, Max, Min

# Количество пользователей
count = User.objects.count()

# Агрегация
stats = User.objects.aggregate(
    total=Count("id"),
    avg_age=Avg("age"),
    max_age=Max("age")
)
print(stats)  # {'total': 100, 'avg_age': 35, 'max_age': 75}

Group By

from django.db.models import Count

# Количество постов по пользователям
by_user = Post.objects.values("user").annotate(
    post_count=Count("id")
)
# Результат: [{'user': 1, 'post_count': 5}, {'user': 2, 'post_count': 3}]

Select related и prefetch related (оптимизация)

# Для One-to-Many и One-to-One
posts = Post.objects.select_related("author")
# Вместо N+1 запросов, делает 2 запроса (JOIN)

# Для Many-to-Many
posts = Post.objects.prefetch_related("tags")
# Вместо N+1 запросов, делает 2 запроса (отдельный SELECT)

Лучшие практики

✅ Используй bulk_create для много записей

  • bulk_create() — одна операция в БД
  • create() в цикле — много операций

✅ Используй update() для массовых обновлений

  • update() — одна SQL команда
  • Циклом через объекты — медленно

✅ Используй select_related и prefetch_related

  • Избегает N+1 проблемы
  • Значительно ускоряет запросы

✅ Используй F() выражения

  • Безопаснее против race conditions
  • Быстрее чем Python логика

❌ Не используй get() без проверки существования

try:
    user = User.objects.get(id=1)
except User.DoesNotExist:
    user = None

❌ Не обновляй в цикле

# Плохо
for user in users:
    user.status = "active"
    user.save()

# Хорошо
User.objects.filter(id__in=user_ids).update(status="active")

В итоге: Django ORM предоставляет удобные методы для всех CRUD операций с оптимизацией.