Django 休息框架响应(如果存在)

Django rest framework response if exists

我想在尝试创建配置文件时显示错误,但用户已有一个配置文件

在我的 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)

当我为已有用户创建个人资料时,我没有显示错误

perform_create 不是进行此类检查的正确位置。它没有 return 任何东西。

您可以在视图集的创建方法中进行检查:

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)

或者您可以让视图集保持干净和简单,并在序列化程序的验证方法中执行检查。您只需要在创建序列化程序时传入用户实例。您可以使用序列化程序的上下文来执行此操作。 Context docs.