Я не понимаю, почему вы пропускаете oop через все PlayCount
объекты, когда все, что вам нужно, это найти объект для указанных c user
и song
.
Также обратите внимание, что get_or_create
найдет только указанный c объект, который соответствует всем параметрам, которые вы передаете ему, поэтому get_or_create(user=..., song=..., plays=...)
попытается найти объект с точным количеством заданных вами игр, который не является не то, что вы хотите.
Вам нужно только сделать это:
from django.db.models import F
play_counter, created = PlayCount.objects.get_or_create(
user=request.user,
song=song,
defaults={'plays': 1})
if not created:
play_counter.plays = F('plays') + 1
play_counter.save()
Итак, здесь мы сначала выбираем или создаем счетчик для конкретной песни и пользователя. Если мы его создадим, мы установим plays
в 1, установив его в параметре defaults
.
Затем, если он не создан (т.е. он существует), мы увеличиваем plays
на 1 с использованием выражения F
, которое обеспечивает его непосредственное обновление в базе данных (и нет риска возникновения противоречий в базе данных, если другой запрос обновляет то же значение).