Итак, у меня есть API, который берет ключевое слово и запускает некоторые логики c, а затем вставляет данные в таблицу ключевых слов. Модель ключевого слова:
class Keyword(BaseModel):
text = models.CharField(max_length=500, unique=True)
key_id = models.CharField(max_length=20, null=True, blank=True)
def __str__(self):
return my_unicode(self.text)
Теперь из-за некоторой ошибки в моем коде js моего внешнего интерфейса запрос API был отправлен два раза при нажатии кнопки (не является серьезной проблемой). Но в бэкэнде во время обработки ключевого слова запускается следующий код, который создает ошибку UniqueViolation:
def get_data_for_keyword(key, region_id, language_id):
# key is the keyword text that we need to save into db which is coming from network request
# Some code
keyword = Keyword.objects.filter(text__iexact=key)
if keyword.exists():
keyword = keyword[0]
# some code
else:
keyword = Keyword(text=key)
keyword.save()
# some code
Сценарий: два запроса идут с одним и тем же ключевым словом (из-за ошибки js). Ожидаемое поведение: оба запроса проверяют наличие этого ключевого слова в БД, тот, который запускается первым, не находит его в БД, создает его, а другой находит его в БД, и происходит дальнейшая обработка. Но происходит то, что оба запроса выполняются одновременно, и оба при фильтрации не находят это ключевое слово, и оба пытаются его создать и сохранить. Один становится успешным, а другой получает
django.db.utils.IntegrityError: duplicate key value violates unique constraint "app_keyword_text_31586601_uniq"
DETAIL: Key (text)=(new api) already exists.
. Это ожидаемое поведение django. Мой вопрос заключается в том, должны ли мы как разработчик приложений обрабатывать такие случаи, или django должен обрабатывать такие случаи. Я использую Postgres в качестве базы данных. Дайте мне знать, если трассировка стека необходима.