Django REST调用反向细节路线找不到kwargs

时间:2016-09-30 04:14:48

标签: django django-rest-framework

我正在实施' 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)

1 个答案:

答案 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)

注意:

  • 这仅适用于使用GenericView或类似ModelViewset
  • 的子类
  • 我使用python3 super语法,如果你使用python2,请不要忘记调整它