重写Django

编程入门 行业动态 更新时间:2024-10-28 16:19:43
重写Django-Rest-Framework序列化程序的is_valid方法(Overriding Django-Rest-Framework serializer is_valid method)

我有一个关于覆盖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

I have a quick question about overriding is_valid. Self is a rest_framework.serializers.ModelSerializer. I'm trying to figure out if there is a better way to modify internal data than reading/writing to the data._kwargs property. I know I can get the data pre-validation via a self.get_initial() call. But I'd also like to be able to write data. The purpose here is to change Image Data, if not properly formatted, into a format our models accept so that our API is more flexible. I know there may be other ways to accomplish my goals, but my generic question is "Is there a good method to set data on a serializer before is_valid() is called?" because it applies to other cases too. Thank you!

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)

Personally, I would write a custom field for the profile_image(or extend image field) and overwrite the to_internal_value method to hold this custom logic. This will be called by during field validation. Here is a psuedo-example:

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

To answer your generic question, I usually use custom to_internal_value() methods for fields and serializers to handle any discrepancies between incoming and expected data. These methods are run during validation and allow you to control the data in an obvious manner to someone reading your code in the future.

Clarification


The serializer itself has a 'to_interval_value' method which allows you to modify/process the data you pass to it during the serializer's data validation (but before the data itself is validated). Modifying data at this point will also happen before field level validation. So, if you want to rename a field that is being passed to your endpoint into something you expect, or if you want to add a null value for a field that has not been passed in the data, this would be the place to do it.

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)

更多推荐

本文发布于:2023-07-15 11:06:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1112878.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:重写   Django

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!