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

2024-04-25 21:54:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我是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"

Tags: 方法selfhellodatareturnputdefcreate
1条回答
网友
1楼 · 发布于 2024-04-25 21:54:31

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

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

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

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

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

相关问题 更多 >