0

我试图使用Django创建一个web应用程序的音乐和Django的REST框架 - 问题就出在执行.Everytime用户播放歌曲的聆听记录计数器,计数器对于那个song_id,user_id应该增加。Django的创建行,如果超密钥不存在,否则更新

我的模型看起来像这样,

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,但如果用户名和songid,存在,它应该改为投入增加listen_count字段。现在我得到的错误是“唯一约束失败:api_listen_record.id”

是否有实现此功能或如何解决该错误的更优雅的方式?

编辑:我得到的存在update_or_create方法,但我怎么使用Django的REST框架使用它与后/ put方法方面?

+0

的可能的复制(http://stackoverflow.com/questions/14115318/create-django-model-or-update-if-exists) – Dap

回答

1

愚弄的人基本上,默认的方法是POST,但如果用户名和 songid,存在,就应该把,而不是递增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"}) 
+0

谢谢[如果不存在创建的Django模型或更新]!它现在有些作品了,但put请求给出了一个错误 - “预期的视图ListenRecordCreateAPIView被一个名为”pk“的URL关键字参数调用。修正你的URL conf,或者在视图上正确设置'.lookup_field'属性。我的听数仍在更新,但愿意摆脱这些错误。 – hfz

0

您可以使用Django的update_or_create方法,如果你是在Django的1点7 例从自己的文件

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

返回一个实例采取何创建创建是decievingly一个布尔值。

也是本Create Django model or update if exists

相关问题