获取或创建Django中的增量模型字段

2024-06-09 14:10:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在开发一个音乐网络应用程序,我试图计算一首歌的播放次数。单击播放按钮时,将调用名为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循环时,127.0.0.1:8000返回play is not defined

我该怎么办


Tags: orfalsegetifobjectssongrequestsave
1条回答
网友
1楼 · 发布于 2024-06-09 14:10:40

我不明白为什么要遍历所有的PlayCount对象,而只需要找到特定的usersong对象

还请注意get_or_create将只找到与传递给它的参数匹配的特定对象,因此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()

因此,这里我们首先获取或创建特定歌曲和用户的计数器。如果我们创建它,我们通过在defaults参数中设置它来将plays设置为1

然后,如果没有创建它(即,它是一个现有的),我们使用F表达式将plays增加1,这样可以确保它直接在数据库中更新(如果另一个请求正在更新相同的值,则不存在数据库不一致的风险)

相关问题 更多 >