【发布时间】:2017-04-12 10:40:09
【问题描述】:
我正在尝试使用 django 和 django rest 框架创建一个音乐 webapp - 问题在于实现收听记录计数器。每次用户播放歌曲时,该 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 字段。我现在得到的错误是“UNIQUE 约束失败:api_listen_record.id”
是否有更优雅的方式来实现此功能或如何修复错误?
编辑:我知道有 update_or_create 方法,但是我如何使用 django rest 框架在 post/put 方法的上下文中使用它?
【问题讨论】:
标签: django python-3.x django-models django-views django-rest-framework