首页 > 解决方案 > Django Rest Framework 序列化程序方法调用

问题描述

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

我的理解是,发送 POST 或 PUT 请求时会自动触发创建和更新方法。有没有办法调用一个新函数,比如 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"

标签: pythondjangodjango-rest-framework

解决方案


要调用与更新方法不同的方法,您需要覆盖序列化程序的 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 Framework 默认实现。

但是您可能想要做的是通过覆盖 def perform_update() 方法来修改您的 ViewSet:

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

推荐阅读