为了账号安全,请及时绑定邮箱和手机立即绑定

增量模型字段内部获取或创建 Django

增量模型字段内部获取或创建 Django

人到中年有点甜 2022-09-27 16:41:19
我正在开发一个音乐Web应用程序,我试图计算一首歌的播放次数。单击播放按钮时,将调用一个名为的函数。在这里,我尝试使用来更新模型,如下所示。getLink()get_or_createPlayCounth = 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:8000play is not defined我该如何继续?
查看完整描述

1 回答

?
蝴蝶不菲

TA贡献1810条经验 获得超4个赞

我不明白为什么你循环遍历所有对象,而你所需要的只是找到特定和.PlayCountusersong


另请注意,只会找到与您传递给它的所有参数匹配的特定对象,因此将尝试查找具有您指定的确切播放次数的对象,该对象不是您想要的。get_or_createget_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()

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


然后,如果未创建它(即它是现有的),我们使用表达式递增1,这可确保它直接在数据库中更新(并且如果另一个请求正在更新相同的值,则不会有数据库不一致的风险)。playsF


查看完整回答
反对 回复 2022-09-27
  • 1 回答
  • 0 关注
  • 114 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号