Эффективный способ избежать добавления повторяющихся записей в модель Django - PullRequest
1 голос
/ 25 апреля 2020

Я прочитал довольно много постов о том, как сделать базу данных / модель уникальной в Django, и все это, похоже, работает. Тем не менее, я не вижу сообщений, обсуждающих эффективный способ избежать добавления повторяющихся записей в базу данных.

Моя модель выглядит следующим образом:

# from app.models
class TestModel(models.Model):
    text = models.TextField(unique=True, null=True)
    fixed_field = models.TextField()

В настоящее время я избегаю добавления повторяющихся записей без получения ошибки следующим образом.

# from app.views
posts = ["one", "two", "three"]
fixed_field = "test"

for post in posts:
    try:
        TestModel(text=post, fixed_field = fixed_field).save()
    except IntegrityError:
        pass

Если бы я не стал сделать это, я бы получил IntegrityError. Есть ли способ сделать это более эффективным?

1 Ответ

1 голос
/ 25 апреля 2020

Если вы добавляете элементы в большом количестве, вы можете попытаться предотвратить добавление этих элементов в первую очередь, выбрав тексты, которые должны быть уникальными, и затем составить список из 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 из списка, и пытается вставить их.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...