Комментарии (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 операций с оптимизацией.