django Несколько новых запросов к API вызывают уникальную ошибку нарушения. - PullRequest
0 голосов
/ 04 мая 2020

Итак, у меня есть 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 в качестве базы данных. Дайте мне знать, если трассировка стека необходима.

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