Охватываемые темы: bulk_create — массовое создание, bulk_update — массовое обновление, update() — обновление через queryset, delete() — удаление через queryset.
bulk_create — массовое создание
tasks = [
Task(title='Задача 1', status='todo'),
Task(title='Задача 2', status='todo'),
Task(title='Задача 3', status='in_progress'),
]
Task.objects.bulk_create(tasks)
# Один SQL INSERT вместо трёх
bulk_update — массовое обновление
tasks = Task.objects.filter(status='todo')
for task in tasks:
task.priority = 5
Task.objects.bulk_update(tasks, ['priority'])
# Один SQL UPDATE вместо N
update() — обновление через queryset
# Обновить статус всех просроченных задач
Task.objects.filter(due_date__lt=today, status='todo').update(status='overdue')
delete() — удаление через queryset
# Удалить все завершённые задачи старше 30 дней
Task.objects.filter(status='done', updated_at__lt=threshold).delete()
Сравнение производительности
| Способ | 1000 объектов | SQL-запросы |
|---|---|---|
Цикл save() |
медленно | 1000 |
bulk_create() |
быстро | 1 |
update() |
очень быстро | 1 |
Ограничения bulk_create
- Не вызывает
save()и сигналы - Не обновляет
auto_nowполя по умолчанию - Для PostgreSQL поддерживает
update_conflicts=True
Task.objects.bulk_create(
tasks,
update_conflicts=True,
unique_fields=['title'],
update_fields=['status', 'priority'],
)
💬 Комментарии (0)
Комментариев пока нет
Станьте первым, кто поделится мнением об этой статье!