【问题标题】:Django rest framework response if existsDjango rest 框架响应(如果存在)
【发布时间】:2020-03-01 15:52:42
【问题描述】:

我想在尝试创建个人资料但用户已有个人资料时显示错误

在我看来.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)

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

【问题讨论】:

  • 您可以使用message将错误返回给模板

标签: django django-rest-framework response


【解决方案1】:

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

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

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.

【讨论】:

    猜你喜欢
    • 2018-12-08
    • 2020-06-17
    • 1970-01-01
    • 2017-09-23
    • 1970-01-01
    • 2016-12-27
    • 2021-01-30
    • 1970-01-01
    • 2020-12-04
    相关资源
    最近更新 更多