覆盖 Django-Rest-Framework 序列化程序 is_valid 方法
Overriding Django-Rest-Framework serializer is_valid method
我有一个关于覆盖 is_valid
的快速问题。自己是一个rest_framework.serializers.ModelSerializer
。我想弄清楚是否有比 reading/writing 到 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' 方法,允许您 modify/process 在序列化程序的数据验证期间(但在数据本身被验证之前)传递给它的数据。此时修改数据也将发生在字段级验证之前。因此,如果您想将传递给端点的字段重命名为您期望的内容,或者如果您想为数据中未传递的字段添加空值,那么这里就是这样做的地方.
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
的快速问题。自己是一个rest_framework.serializers.ModelSerializer
。我想弄清楚是否有比 reading/writing 到 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' 方法,允许您 modify/process 在序列化程序的数据验证期间(但在数据本身被验证之前)传递给它的数据。此时修改数据也将发生在字段级验证之前。因此,如果您想将传递给端点的字段重命名为您期望的内容,或者如果您想为数据中未传递的字段添加空值,那么这里就是这样做的地方.
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)