[英]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.