Как избежать перекрытия запросов при создании новых объектов?
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
(с помощью сигнала)