簡體   English   中英

如何使用 django rest 框架在視圖中執行更新或創建?

[英]How to perform an update or create in the view using django rest framework?

我正在嘗試使用 django 和 django rest 框架創建音樂 web 應用程序 - 問題在於實現收聽記錄計數器。每次用戶播放歌曲時,該 Song_id,user_id 的計數器應該增加。

我的模型看起來像這樣,

class Listen_Record(models.Model):
    number=None
    listen_count = models.IntegerField(default=1,null=True)
    user = models.ForeignKey(User)
    songid = models.ForeignKey(Song)

我的看法,

class ListenRecordCreateAPIView(GenericAPIView,CreateModelMixin,UpdateModelMixin):
    queryset = Listen_Record.objects.all()
    serializer_class = ListenRecordListSerializer



    def put(self,request,*args,**kwargs):
        if Listen_Record.objects.filter(user=request.data['user'], songid=request.data['songid']).exists():

            tableid = Listen_Record.objects.values_list('id', flat=True).filter(user=request.data['user'],
                                                                                songid=request.data['songid']).get()
            cnt = None
            try:
                cnt = Listen_Record.objects.get(id=tableid)
                print(cnt)
            except AttributeError:

                cnt.listen_count = 0

            cnt.listen_count += 1
            print(cnt.listen_count)
            cnt.save(['listen_count'])
        return self.update(cnt,*args,**kwargs)

    def post(self, request, *args, **kwargs):
        if Listen_Record.objects.filter(user=request.data['user'], songid=request.data['songid']).exists():
            self.put(request, *args, **kwargs)
        else:
            return self.create(request,*args,**kwargs)

基本上,默認方法是 POST,但如果 userid 和 songid 存在,則應該 PUT 來增加 listen_count 字段。 我現在得到的錯誤是“唯一約束失敗:api_listen_record.id”

是否有更優雅的方法來實現此功能或如何修復錯誤?

編輯:我知道有 update_or_create 方法,但是我如何在使用 django rest 框架的 post/put 方法的上下文中使用它?

基本上,默認方法是 POST,但如果 userid 和 songid 存在,則應該 PUT 來增加 listen_count 字段。 我現在得到的錯誤是“唯一約束失敗:api_listen_record.id”

這是你的主要問題。 前提是客戶端發出正確的請求,您作為 API 的工作是驗證請求。

如果你真的想強制執行 PUT 與 POST,那么如果記錄存在,並且請求是 POST,你應該拒絕它:

from rest_framework.exceptions import ValidationError

def post(self, request, *args, **kwargs):
    filter = Listen_Record.objects.filter(user=request.data['user'],
                                          songid=request.data['songid'])
    if filter.exists():
        raise ValidationError({'error': 'POST not allowed, send PUT'})
    else:
        return self.create(request,*args,**kwargs)

同樣,你的 PUT 方法也應該有這樣的檢查:

def put(self,request,*args,**kwargs):
    try:
       record = Listen_Record.objects.get(user=request.data['user'],
                                          songid=request.data['songid'])
       record.listen_count = record.listen_count + 1
       record.save()
       return self.update(record,*args,**kwargs)
    except Listen_Record.DoesNotExist:
       raise ValidationError({"error": "Send POST not PUT to create records"})

如果您使用的是 django 1 dot 7,則可以使用 django 的 update_or_create 方法。示例取自他們的文檔

obj, created = Person.objects.update_or_create(
    first_name='John', last_name='Lennon', defaults=updated_values)

返回一個實例並創建,其中 created 是一個布爾值。

也是這個Create Django 模型的復制品或更新(如果存在)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM