Реакция Django для остальных - PullRequest
0 голосов
/ 05 ноября 2019

Я хочу показать ошибку при попытке создать профиль, но у пользователя уже есть один

в моем 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)

, когда я создаю профиль для пользователя, который ужеесть один, я не могу показать ошибку

1 Ответ

0 голосов
/ 05 ноября 2019

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)

Или вы можете оставить ваш viewset чистым и простым и выполнить проверку в валидаторе вашего сериализатора. метод. Вам просто нужно передать пользовательский экземпляр при создании сериализатора. Вы можете сделать это, используя контекст сериализатора. Контекстные документы .

...