加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python – 重写Django-Rest-Framework序列化器is_valid方法

发布时间:2020-12-20 11:44:10 所属栏目:Python 来源:网络整理
导读:我有一个关于覆盖is_valid的快速问题. Self是一个rest_framework.serializers.ModelSerializer.我试图弄清楚是否有更好的方法来修改内部数据,而不是读取/写入data._kwargs属性.我知道我可以通过self.get_initial()调用获得数据预验证.但我也希望能够写出数据
我有一个关于覆盖is_valid的快速问题. Self是一个rest_framework.serializers.ModelSerializer.我试图弄清楚是否有更好的方法来修改内部数据,而不是读取/写入data._kwargs属性.我知道我可以通过self.get_initial()调用获得数据预验证.但我也希望能够写出数据.这里的目的是将图像数据(如果格式不正确)更改为我们的模型接受的格式,以便我们的API更灵活.我知道可能还有其他方法可以实现我的目标,但我的一般性问题是“在调用is_valid()之前,是否有一种在序列化程序上设置数据的好方法?”因为它也适用于其他情况.谢谢!

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)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读