python - 覆盖 Django-Rest-Framework 序列化程序 is_valid 方法

标签 python django overriding django-rest-framework

我有一个关于覆盖 is_valid 的快速问题。 Self 是一个 rest_framework.serializers.ModelSerializer。我想弄清楚是否有比读取/写入 data._kwargs 属性更好的修改内部数据的方法。我知道我可以通过 self.get_initial() 调用获得数据预验证。但我也希望能够写入数据。这里的目的是将图像数据(如果格式不正确)更改为我们的模型接受的格式,以便我们的 API 更加灵活。我知道可能还有其他方法可以实现我的目标,但我的一般问题是

Is there a good method to set data on a serializer before is_valid() is called?

因为它也适用于其他情况。谢谢!

def is_valid(self, raise_exception=True):
    imageHandler = ImageHandler()
    if "member_profile" in self._kwargs["data"]:
        if "profile_image" in self._kwargs["data"]["member_profile"]:
            self._kwargs["data"]["member_profile"]["profile_image"] = imageHandler.convertImage(
                self._kwargs["data"]["member_profile"]["profile_image"])
    else:
        self._kwargs["data"]["member_profile"] = {}
    valid = super(AuthUserModelSerializer, self).is_valid(raise_exception=raise_exception)
    return valid

最佳答案

就个人而言,我会为 profile_image(或扩展图像字段)编写一个自定义字段并覆盖 to_internal_value 方法以保存此自定义逻辑。这将在字段验证期间被调用。这是一个伪示例:

class ProfileImageField(ImageField):

    def to_internal_value(self, data):
       converted = ImageHandler().convertImage(data)
       return super(ProfileImageField,self).to_internal_value(converted)

为了回答您的一般性问题,我通常对字段和序列化程序使用自定义 to_internal_value() 方法来处理传入数据和预期数据之间的任何差异。这些方法在验证期间运行,允许您以一种对将来阅读您的代码的人来说显而易见的方式控制数据。

澄清


序列化器本身有一个“to_interval_value”方法,允许您在序列化器的数据验证期间(但在数据本身被验证之前)修改/处理传递给它的数据。此时修改数据也将发生在字段级验证之前。因此,如果您想将传递给端点的字段重命名为您期望的内容,或者如果您想为数据中未传递的字段添加空值,那么这里就是这样做的地方.

class MySerializer(serializers.ModelSerializer):

    def to_internal_value(self, data):
       if 'member_profile' not in data:
           data['member_profile'] = {}
       return super(MySerializer,self).to_internal_value(data)

关于python - 覆盖 Django-Rest-Framework 序列化程序 is_valid 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31281938/

相关文章:

swift - 如何让标签不断显示 int (swift4)

python - Django Admin + FORCE_SCRIPT_NAME + 登录重定向错误

python - Django:如何动态加载表单到当前html页面

java - java继承中的隐藏方法

python - Matplotlib 的 FuncAnimation 不止一次调用 init_func

python - Internet Explorer 8 中提示文件下载时原型(prototype) Ajax.Request 出现问题

c++ - 为什么派生类中的重写函数会隐藏基类的其他重载?

python - C 中的 Numpy 数组

python - 通过 Python Flask 从一个 HTML 输入中获取多个值

python - 如何在seaborn boxplot中的相同子组之间创建间距?