【问题标题】:Overriding Django-Rest-Framework serializer is_valid method覆盖 Django-Rest-Framework 序列化器 is_valid 方法
【发布时间】:2015-09-25 17:31:32
【问题描述】:

我有一个关于覆盖is_valid 的简短问题。自我是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

【问题讨论】:

    标签: python django overriding django-rest-framework


    【解决方案1】:

    就个人而言,我会为 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)
    

    【讨论】:

    • 谢谢,我可能会改用你的方法。但是我仍然有一个问题,在调用 is_valid() 之前,有没有一种好方法可以更改序列化程序对象(对象本身)上的数据?
    • 我已经添加了一个澄清,我相信这更好地回答了你的问题。
    • 由于可变标志,这对我不起作用,直到我从这个链接stackoverflow.com/a/51196932/2826818进行更改之前@
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-02
    • 2017-05-09
    • 1970-01-01
    • 1970-01-01
    • 2015-06-29
    • 2016-04-10
    相关资源
    最近更新 更多