Python Django Rest框架序列化程序方法调用

Python Django Rest框架序列化程序方法调用,python,django,django-rest-framework,Python,Django,Django Rest Framework,我是Django Rest框架的新手,我想知道如何在ModelSerializer类中调用创建和更新方法 据我所知,当发送POST或PUT请求时,会自动触发create和update方法。有没有办法调用一个新函数,比如say_hello() 这里有一个例子。当我点击一个PUT请求时,我想调用方法say_hello() class UserSerializer(serializers.ModelSerializer): """Serialize

我是Django Rest框架的新手,我想知道如何在ModelSerializer类中调用创建和更新方法

据我所知,当发送POST或PUT请求时,会自动触发create和update方法。有没有办法调用一个新函数,比如say_hello()

这里有一个例子。当我点击一个PUT请求时,我想调用方法say_hello()

    class UserSerializer(serializers.ModelSerializer):
        """Serializer for the users object"""
    
        class Meta:
            model = User
            fields = "__all__"
    
        def create(self, validated_data):
            """Create a new user with encrypted password and return it"""
            return get_user_model().objects.create_user(**validated_data)
    
        def update(self, instance, validated_data):
            """Update an user, setting the password and return it"""
            password = validated_data.pop('password', None)
            user = super().update(instance, validated_data)
    
            if password:
                user.set_password(password)
                user.save()
    
            return user
    
        def say_hello(self, validated_data):
            print(validated_data)
            return "Hello you"

要调用与update方法不同的方法,需要覆盖序列化程序的def save()方法:

您可以查看Django Rest框架的默认实现

但您可能更愿意做的是通过覆盖def perform_update()方法来修改视图集:


您可以从
update()
方法调用
say_hello(…)
方法,对吗?当然可以,但是我如何调用其他方法来代替update,create?这在视图中发生。这真的很清楚你在用什么样的观点。在常规视图中,您可以在
perform\u create(self,serializer)
perform\u update(self,serializer)
中更改此行为。非常感谢您的回复
def save(self, **kwargs):
    validated_data = [
        {**attrs, **kwargs} for attrs in self.validated_data
    ]

    if self.instance is not None:
        self.instance = self.say_hello(self.instance, validated_data)
        assert self.instance is not None, (
            '`update()` did not return an object instance.'
        )
    else:
        self.instance = self.create(validated_data)
        assert self.instance is not None, (
            '`create()` did not return an object instance.'
        )

    return self.instance
def perform_update(self, serializer):
    serializer.say_hello()