Увеличить поле модели внутри Get или Create Django - PullRequest
0 голосов
/ 04 апреля 2020

Я занимаюсь разработкой веб-приложения musi c, в котором пытаюсь подсчитать, сколько раз была воспроизведена песня. При нажатии кнопки воспроизведения вызывается функция с именем getLink(). Здесь я пытаюсь использовать get_or_create для обновления модели PlayCount, вот так.

h = PlayCount.objects.all()

    if len(h) == 0:
        u = PlayCount.objects.get_or_create(
            user=request.user.username,
            song=song,
            plays=1,
        )[0]
        u.save()

    else:

        flag = False

        for i in h:
            if i.song == song:
                u = PlayCount.objects.get_or_create(
                    user=request.user.username,
                    song=song,
                    plays=plays + 1,
                )[0]
                u.save()
                flag = True
                break
            else:
                pass

        if flag is False:
            u = PlayCount.objects.get_or_create(
                user=request.user.username,
                song=song,
                plays=1,
            )[0]
            u.save()
        else:
            pass

Однако, когда я ввожу else l oop, 127.0.0.1:8000 возвращает play is not defined.

Как мне поступить?

1 Ответ

2 голосов
/ 04 апреля 2020

Я не понимаю, почему вы пропускаете 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, которое обеспечивает его непосредственное обновление в базе данных (и нет риска возникновения противоречий в базе данных, если другой запрос обновляет то же значение).

...