Django REST框架 - {pk} url

时间:2017-01-14 11:10:03

标签: django django-rest-framework

有一个标准的ViewSet,网址如下:/ api / users /和/ api / users / {pk} /。我希望/ api / users / me /的行为与pk访问的详细视图完全相同(所以/ api / users / me /表现得像/ api / users / 5 /如果你的用户ID是5)。

我试过这个:

def dispatch(self, request, *args, **kwargs):
    if kwargs.get('pk') == 'me' and request.user:
        kwargs['pk'] = request.user.pk

    return super(UserViewSet, self).dispatch(request, *args, **kwargs)

而且,它与SessionAuthentication完美配合(所有HTTP方法)但与TokenAuthentication无效。使用TokenAuthentication,它返回:

curl -H "Authorization: Token f14b876aa54ebb7679330b88ea1c5b5ea4d693e9" http://127.0.0.1:8000/api/users/me/
{"detail":"Not found."}

而且,dispatch()甚至没有被执行,所以早些时候必须阻止它。其他视图(例如/ api / users /)正常工作。可能是什么原因,如何调试?

1 个答案:

答案 0 :(得分:1)

我最终使用了更优雅的东西:

def get_object(self):
    if self.kwargs['pk'] == 'me':
        return self.request.user
    else:
        return super().get_object()

为什么最初的想法适用于SessionAuthentication而不是TokenAuthentication仍然是个谜。