Django rest框架响应,如果存在

问题描述 投票:0回答:1

我想在创建个人资料时显示错误,但用户已经拥有一个

在我的views.py

class ProfileViewSet(viewsets.ModelViewSet):
    serializer_class = ProfileSerializer

    def get_queryset(self):
        queryset = Profile.objects.filter(owner=self.request.user)
        return queryset

    def get_permissions(self):
        permission_classes = []
        if self.action == 'create':
            permission_classes = [IsAuthenticated]
        elif self.action == 'retrieve' or self.action == 'update' or self.action == 'partial_update':
            permission_classes = [IsOwner]
        elif self.action == 'list':
            permission_classes = [IsAuthenticated]
        elif self.action == 'destroy':
            permission_classes = [IsAdminUser]
        return [permission() for permission in permission_classes]

    def perform_create(self, serializer):
        profile = Profile.objects.filter(owner=self.request.user)
        if not profile.exists():
            serializer.save(owner=self.request.user)
        else:
            return Response(data={'detail': 'This user already has a profile'}, status=status.HTTP_400_BAD_REQUEST)

当我在已经有个人资料的用户上创建个人资料时,我不会显示该错误

django django-rest-framework response
1个回答
0
投票

perform_create不是进行此类检查的正确位置。它不返回任何内容。

您可以在viewset的创建方法中进行检查:

class ProfileViewSet(viewsets.ModelViewSet):

    ...

    def create(self, request, *args, **kwargs):
        if Profile.objects.filter(owner=self.request.user).exists():
            return Response(data={'detail': 'This user already has a profile'}, status=status.HTTP_400_BAD_REQUEST)

        return super().create(request,*args,**kwargs)

或者您可以保持视图集的简洁明了,并使用序列化程序的validate方法执行检查。您只需要在创建序列化程序时传入用户实例即可。您可以使用序列化程序的上下文来实现。 Context docs

© www.soinside.com 2019 - 2024. All rights reserved.