Сериализатор is_valid () возвращает true, хотя поля пусты - PullRequest
0 голосов
/ 17 октября 2018

Я попробовал и запустил код с функциональным представлением, и он работал отлично, затем я попытался переключиться на modelViewSet.

Вот мой код для сериализаторов:

UserSerializer

class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = get_user_model()
        username = serializers.CharField(required=True)
        email = email = serializers.EmailField(validators=[UniqueValidator(queryset=get_user_model().objects.all())])
        phone = serializers.CharField(required=True)
        full_name = serializers.CharField(required=True)
        user_type = serializers.CharField(required=True)
        password = serializers.CharField(write_only=True)
        fields=('username', 'email', 'phone', 'full_name', 'user_type','password')

    def create(self, validated_data):

        user = get_user_model().objects.create(
            username=validated_data['username'],
            email=validated_data['email'],
            phone=validated_data['phone'],
            full_name=validated_data['full_name'],
            user_type=validated_data['user_type']
        )
        user.set_password(validated_data['password'])
        user.save()

        return user

Вот мой modelViewSet:

class RegisterView(viewsets.ModelViewSet):
    queryset = ''

def create(self, request):
    if request.data.get('user', dict()).get('user_type') == 'employee':
        userSerializer = UserSerializer(data=request.data.get('user', dict()))
        if userSerializer.is_valid(raise_exception=ValueError):
            serializer = EmployeeSerializer(data=request.data)
            if serializer.is_valid(raise_exception=ValueError):
                serializer.create(validated_data=request.data)
                return Response(serializer.data, status=HTTP_201_CREATED)
            return Response(serializer.error_messages,
                            status=HTTP_400_BAD_REQUEST)

def get_serializer_class(self):
        if self.request.data.get('user', dict()).get('user_type') == 'employee':
            return EmployeeSerializer
        if self.request.data.get('user', dict()).get('user_type') == 'customer':
            return CustomerSerializer
        if self.action == 'customer':
            return CustomerSerializer
        return EmployeeSerializer

Теперь, если я не передаю имя пользователя или пароль, is_valid для userSerializer выдает ошибку, но если я не передаю электронную почту или телефон или полное_имя is_valid не вызывает никаких исключенийи это остается верным.

Он работал правильно с функциональным представлением или, может быть, я что-то упустил.

Меня беспокоит, что это должно выдать ошибку, если в request.data отсутствует какое-либо значение

1 Ответ

0 голосов
/ 17 октября 2018

Поле Serializer должно быть определено как атрибут сериализатора вместо атрибута meta:

class UserSerializer(serializers.ModelSerializer):
    username = serializers.CharField(required=True)
    email = serializers.EmailField(validators=[UniqueValidator(queryset=get_user_model().objects.all())])
    phone = serializers.CharField(required=True)
    full_name = serializers.CharField(required=True)
    user_type = serializers.CharField(required=True)
    password = serializers.CharField(write_only=True)

    class Meta:
        model = get_user_model()
        fields=('username', 'email', 'phone', 'full_name', 'user_type','password') 

С вашим текущим кодом required=True аргумент не имеет никакого эффекта.

...