python - 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"
解决方案
要调用与更新方法不同的方法,您需要覆盖序列化程序的 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()
推荐阅读
- bash - curl 以速率限制发布音频数据
- c++ - C++ 模板:无法匹配可变参数类模板中的最后一个模板
- javascript - .bind() 什么时候运行?
- iis - Wix 安装程序无法在 IIS 10 中创建应用程序池
- visual-studio-2010 - 带有 TFS 构建工具的 NSIS 安装程序脚本
- ruby - 如何获取包含前导空格的水豚元素的文本。
- c# - Serilog 和 .NET Core 2.1 HostBuilder 配置
- django - 从 Django 表单到 pandas DataFrame
- javascript - 解析一行文本并在给定单词之前动态插入换行符?
- python - 将 DF 行乘以系数