如何解决如何在不传递 url 中的主键的情况下向 ModelViewSet 发送 PUT 请求?
我对使用 ModelViewSet
特别感兴趣
用于解决更新登录用户配置文件的挑战。我使用以下定义:
from rest_framework import viewsets
class ProfileRetrieveUpdate(viewsets.ModelViewSet):
serializer_class = UserProfileSerializer
permission_classes = [permissions.IsAuthenticatedOrReadOnly]
def get_queryset(self):
return UserProfile.objects.filter(user=self.request.user)
def perform_update(self,serializer):
serializer.save(user=self.request.user)
通过覆盖 get_queryset
,我能够获得预期的行为,即当我访问端点时(比如 profile/
),我获得了登录用户的个人资料。但是,如果我必须更新配置文件,我只能通过转到 PUT
来访问 profile/6/
。有没有办法让 ModelViewSet
在同一端点(即 PUT
)公开 profile/
?
解决方法
您可以在任意路径下注册 ModelViewSet
HTTP 方法。
path(
"profile",ProfileRetrieveUpdate.as_view(
{"put": "partial_update","get": "retrieve"}
),name="profile-retrieve-update",)
您将不得不调整其他内容以及您不提供 pk
。
您需要根据需要调整 get_queryset
,而不是覆盖 get_object
方法。
from rest_framework import viewsets
from rest_framework.generics import get_object_or_404
class ProfileRetrieveUpdate(viewsets.ModelViewSet):
serializer_class = UserProfileSerializer
permission_classes = [permissions.IsAuthenticatedOrReadOnly]
queryset = UserProfile.objects.all()
def get_object(self):
obj = get_object_or_404(self.queryset,user=self.request.user)
self.check_object_permissions(self.request,obj)
return obj
def perform_update(self,serializer):
serializer.save(user=self.request.user)
现在,如果您PUT profile/
,它应该会按预期工作。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。