Если вы добавляете элементы в большом количестве, вы можете попытаться предотвратить добавление этих элементов в первую очередь, выбрав тексты, которые должны быть уникальными, и затем составить список из TestModel
, которые не содержат дубликатов:
used_text = set(TestModel.objects.values_list('text', flat=True))
posts = ['one', 'two', 'three']
fixed_field = "test"
test_models = []
for post in posts:
if post not in used_text:
used_text.add(post)
test_models.add(TestModel(text=post, fixed_field = fixed_field))
test_models.objects.bulk_create(test_models)
.bulk_create(..)
[Django -doc] затем создает все записи в массе, обычно в одном запросе. Если количество элементов в нескольких запросах огромно, но в каждом запросе будет вставлено большое количество записей.
Однако из-за условий гонки вышеприведенное может все же завершиться ошибкой, поскольку между извлечением text
s в базе данных и добавление новых, другие запросы могут обновлять состояние базы данных, поэтому, хотя это маловероятно, вам, вероятно, следует поработать с механизмом повтора, который снова отфильтровывает TestModel
s из списка, и пытается вставить их.