我正在实施' users / me /'。 (我也读过the article,但我试着添加一些特定的功能)
我在UserViewSet
:
@list_route()
def me(self, request):
# ... find user ...
request.path = reverse('user-detail', kwargs={'pk': user.id})
self.partial_update(request)
它引发了AssertionError: Expected view UserViewSet to be called with a URL keyword argument named "pk". Fix your URL conf, or set the `.lookup_field` attribute on the view correctly.
print(request.path)
为/users/2/
,因此reverse
正在运作。
urls.py
:
router = routers.DefaultRouter()
router.register(r'users', UserViewSet, base_name='user')
我怎么能提供PK?我不知道我犯了什么错误。
UserViewSet代码:
class UserViewSet(viewsets.ModelViewSet):
queryset = User.objects.all()
serializer_class = UserSerializer
@list_route(methods=['patch'], permission_classes=[IsAuthenticated])
def me(self, request):
user = get_object_or_404(Token, key=request.auth).user
request.path = reverse('user-detail', kwargs={'pk': user.id})
self.partial_update(request, pk=user.id)
serializer = self.get_serializer(user)
return Response(serializer.data)
答案 0 :(得分:0)
我不会使用list_route来实现它,而是使用另一种方法:在视图上覆盖get_object(self)
:
def get_object(self):
if self.kwargs.get(self.lookup_field, None) == 'me':
# ... find user probably using self.get_queryset() or return self.request.user
self.check_object_permissions(self.request, user) # may not be required, see get_object link
return user
return super().get_object()
这使得API在您使用“我”或用户pk时的反应完全相同,并且操作将相同(get,put,patch,... detailed_routes)
注意:
super
语法,如果你使用python2,请不要忘记调整它