Сериализатор не работает в пользовательском методе в наборе представлений модели,

#django #serialization

#django #сериализация

Вопрос:

Это мой пользовательский метод в наборе представлений модели.

 class UserViewSet(viewsets.ModelViewSet):
    @action(detail=False, methods=['POST'],serializer_class=UserSerializer, name='Attach meta items ids')
    def create_user(self, request):
       queryset = User.objects.all() 
       serializer = self.get_serializer(data=request.data)
       serializer.is_valid(raise_exception=True)
       return Response(serializer.data)

 

это мой сериализатор

 
class UserSerializer(serializers.ModelSerializer):

    password = serializers.CharField(write_only=True)
    print("lklml")
    def create(self, validated_data):
        print("hjniknjbj")
        if UserModel.objects.filter(email=validated_data['email']).exists():
            raise serializers.ValidationError("A user is already registered with this e-mail address.")

        if UserModel.objects.filter(
                username=validated_data['username']).exists():
            raise serializers.ValidationError("This username already exists.")
        user = UserModel.objects.create(
            username=validated_data['username'],
            email=validated_data['email']
        )
        # add custom password password validation later
        user.set_password(validated_data['password'])
        user.save()

        return user

    class Meta:
        model = UserModel
        fields = ("id", "username", "password", "email",)
        extra_kwargs = {"password": {'write_only': True}}

 

Теперь, когда я когда-либо захожу в api, он напрямую возвращает данные, которые я отправил, а не проходит через процесс сериализации, т.е. Возвращает то же самое, что я публикую.Проблема возникает только тогда, когда я использую пользовательский метод набора представлений.

 {"username":"pragghgjhhhkhhhhjbjhjhkjbjvin","email":"pravwnkwin@dat.com","password":"kms@1234"}
 

Ответ №1:

Вы должны вызвать serializer.save() , чтобы вызвать функцию создания сериализатора. serializer.is_valid(raise_exception=True) это только для запуска средства проверки, и если вся проверка пройдена, то вызовите serializer.save() , который вызовет ваш create() и вернет созданный экземпляр, к которому можно получить доступ, вызвав serializer.data .