亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

增量模型字段內部獲取或創建 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 關注
  • 106 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號