awi*_*ery 4 django django-rest-framework
假设我有一个ViewSet:
class ProfileViewSet(viewsets.ModelViewSet):
"""
API endpoint that allows a user's profile to be viewed or edited.
"""
permission_classes = (permissions.IsAuthenticatedOrReadOnly, IsOwnerOrReadOnly)
queryset = Profile.objects.all()
serializer_class = ProfileSerializer
def perform_create(self, serializer):
serializer.save(user=self.request.user)
Run Code Online (Sandbox Code Playgroud)
...和一个HyperlinkedModelSerializer:
class ProfileSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Profile
read_only_fields = ('user',)
Run Code Online (Sandbox Code Playgroud)
我的urls.py设置如下:
router.register(r'profiles', api.ProfileViewSet, base_name='profile')
Run Code Online (Sandbox Code Playgroud)
这让我可以访问,例如/api/profile/1/很好。
我想在我的 API 上设置一个新端点(类似于 Facebook API 的/me/调用)/api/profile/me/以访问当前用户的个人资料 - 如何使用 Django REST Framework 执行此操作?
使用@Gerard 的解决方案给我带来了麻烦:
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..
Run Code Online (Sandbox Code Playgroud)
看一下retrieve()的源代码似乎user_id没有使用(未使用*args)
此解决方案有效:
from django.contrib.auth import get_user_model
from django.shortcuts import get_object_or_404
from rest_framework import filters
from rest_framework import viewsets
from rest_framework import mixins
from rest_framework.decorators import list_route
from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response
from ..serializers import UserSerializer
class UserViewSet(viewsets.ModelViewSet):
"""
A viewset for viewing and editing user instances.
"""
serializer_class = UserSerializer
User = get_user_model()
queryset = User.objects.all()
filter_backends = (filters.DjangoFilterBackend, filters.SearchFilter)
filter_fields = ('username', 'email', 'usertype')
search_fields = ('username', 'email', 'usertype')
@list_route(permission_classes=[IsAuthenticated])
def me(self, request, *args, **kwargs):
User = get_user_model()
self.object = get_object_or_404(User, pk=request.user.id)
serializer = self.get_serializer(self.object)
return Response(serializer.data)
Run Code Online (Sandbox Code Playgroud)
访问/api/users/me具有相同数据的回复/api/users/1(当登录用户是 user 时pk=1)
您可以使用装饰器在视图类中创建一个新方法list_route,例如:
class ProfileViewSet(viewsets.ModelViewSet):
@list_route()
def me(self, request, *args, **kwargs):
# assumes the user is authenticated, handle this according your needs
user_id = request.user.id
return self.retrieve(request, user_id)
Run Code Online (Sandbox Code Playgroud)
请参阅有关此的文档以获取更多信息@list_route
我希望这有帮助!
| 归档时间: |
|
| 查看次数: |
3767 次 |
| 最近记录: |