Как избежать перекрытия запросов при создании новых объектов?

def artist(request):
    print("START")
    if request.method == "GET":
        try:
            artist = Artist.objects.get(user=request.user)
            print("artist exists")
        except Artist.DoesNotExist:
            print("artist doesn't exist")
            artist = Artist.objects.get_or_create(user=request.user)[0]
            print("a new artist object has been created")
        
        return HttpResponse(status=200)

Консоль:

START
artist doesn't exist
START
artist doesn't exist
a new artist object has been created
[15/Dec/2022 12:40:23] "GET /artist/ HTTP/1.1" 200 0
a new artist object has been created
[15/Dec/2022 12:40:23] "GET /artist/ HTTP/1.1" 200 0

На стороне клиента на экране есть кнопка, которая посылает запрос, возвращающий пользователю его страницу художника, или, если у него ее нет, она будет создана для него. И если пользователь дважды щелкнет на кнопке, то будут созданы два объекта. Поле user в Artist не уникально, мы игнорируем тот факт, что мы можем решить проблему на стороне клиента с помощью javascript, и мы предполагаем, что сервер немного медленный, поэтому он не успевает обработать два запроса за такое короткое время.

В модели Artist есть поле, которое во время создания должно быть заполнено некоторой информацией на основе фотографии профиля, т.е. я извлекаю доминирующий цвет из фотографии, чтобы использовать его позже на странице, это не имеет значения, мы просто предполагаем, что создание занимает немного больше времени

Я также хочу создать объект без формы, я буду использовать форму позже для обновления профиля, если пользователь захочет. Также игнорировать создание объекта Artist после создания user (с помощью сигнала)

Вернуться на верх