> Как эффективно загрузить большое количество данных из файла в таблицу Django (Python)

Уровень: senior · Роль: backend · Язык: Python · Категория: Технические вопросы

Компании: inpglobal

Стек: Python

> Пример ответа

Для эффективной загрузки большого объёма данных из файла в Django рекомендуется использовать bulk_create() вместо циклического вызова save(). Это позволяет вставлять записи одной массовой операцией SQL, что значительно ускоряет процесс.

Пример для CSV-файла:

PYTHON
import csv
from django.db import transaction
from myapp.models import MyModel
def bulk_load_from_csv(file_path, batch_size=5000):
objects = []
with open(file_path, newline='', encoding='utf-8') as csvfile:
reader = csv.DictReader(csvfile)
for row in reader:
obj = MyModel(
field1=row['field1'],
field2=int(row['field2']),
# ... остальные поля
)
objects.append(obj)
if len(objects) >= batch_size:
with transaction.atomic():
MyModel.objects.bulk_create(objects, ignore_conflicts=True)
objects.clear()
# Загрузка оставшихся записей
if objects:
with transaction.atomic():
MyModel.objects.bulk_create(objects, ignore_conflicts=True)

Ключевые моменты:

  • Используйте transaction.atomic() для атомарности каждой пачки.
  • Параметр ignore_conflicts=True позволяет пропускать дубликаты (если есть уникальные ограничения).
  • Размер пачки (batch_size) подбирайте экспериментально (обычно 1000-10000 записей).
  • Для очень больших файлов (гигабайты) рассмотрите потоковую обработку с помощью csv.reader или pandas с чанками.

Альтернативы:

  • Для JSON: bulk_create с десериализацией через json.load().
  • Для Excel: библиотека openpyxl с итерацией по строкам.
  • Если данные нужно предварительно валидировать, используйте Model.objects.bulk_create() после подготовки списка объектов.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью