Если вы не уверены, что вещи из вашего item_list
уже существуют в вашей БД, и вам нужны объекты модели, тогда get_or_create
- определенно правильный путь.
Если вы знаете, что элементы НЕ находятся в вашей БД, вам будет гораздо лучше:
for item in item_list:
new = Entry.objects.create(
field1 = item.field1,
field2 = item.field2,
)
А если вам не нужны объекты, просто игнорируйте возврат из вызова функции. Это не ускорит работу с БД, но поможет с управлением памятью, если это проблема.
Если вы не уверены, что данные уже находятся в БД, но в любом из полей есть флаг unique=True
, БД применит уникальность, и вы можете просто перехватить исключение и двигаться дальше. Это предотвратит дополнительное попадание в БД, избегая попытки выбрать существующий объект.
from django.db import IntegrityError
for item in item_list:
try:
new = Entry.objects.create(
field1 = item.field1,
field2 = item.field2,
)
except IntegrityError:
continue
Вы можете увеличить скорость в любом случае, управляя транзакциями вручную. Django автоматически создает и фиксирует транзакцию при каждом сохранении, но предоставляет некоторые декораторы, которые значительно повысят эффективность, если вы знаете, что в конкретной функции вы будете выполнять большое количество сохранений БД. Документы Django лучше объясняют все это, чем я, но вы, вероятно, захотите обратить особое внимание на django.db.transaction.commit_on_success