Serialization Django rest框架:在使用序列化程序验证数据之前,是否有方法清理数据?

Serialization Django rest框架:在使用序列化程序验证数据之前,是否有方法清理数据?,serialization,django-rest-framework,Serialization,Django Rest Framework,我有一个API端点POST/data。 接收到的数据以某种方式格式化,这与我在数据库中存储数据的方式不同 我将使用postgis中的几何体类型作为示例 类MyPostgisModel(models.Model): ... position=models.PointField(null=True) my_charfield=models.charfield(最大长度=10) ... errors=JSONField()#用于保存清理和验证错误 类MyPostgisSerializer(serial

我有一个API端点POST
/data
。 接收到的数据以某种方式格式化,这与我在数据库中存储数据的方式不同

我将使用postgis中的几何体类型作为示例

类MyPostgisModel(models.Model):
...
position=models.PointField(null=True)
my_charfield=models.charfield(最大长度=10)
...
errors=JSONField()#用于保存清理和验证错误
类MyPostgisSerializer(serializers.ModelSerializer):
类元:
模型=MyPostgisModel
字段=[
...
“职位”,
...
“我的查菲尔德”,
“错误”,
]
def至_内部_值(自身、数据):
...
#在这里,数据来自字段几何体,但在db中,它被称为
#位置。此外,我需要应用`GEOSGeometry(json.dumps(…))`
#方法也一样。
data[“position”]=GEOSGeometry(json.dumps(data[“geometry”]))
返回数据
问题在于,像
position
这样的字段不仅有一个,还有很多。我希望(可能是错误的)像
验证*field u name*
方案那样做,但是为了清洁(
清洁*field u name*

还有一个问题。在这个方案中,即使某些字段引发了ValidationError(例如:过长的CharField)不是主键/unique\u约束的一部分,我仍然希望将其余数据保存在数据库中。并将相关错误保存到JSONField中,如下所示:

{
    "cleaning_errors": {
        ...
        "position": 'Invalid format: {
            "type": "NotAValidType",  # Should be "Point"
            "coordinates": [
                4.22,
                50.67
            ]
        }'
        ...
    },
    "validating_errors": {
        ...
        "my_charfield": "data was too long: 'this data is way too long for 10 characters'",
        ...
    }
}
对于第一个问题,我想做这样的事情:

{
    "cleaning_errors": {
        ...
        "position": 'Invalid format: {
            "type": "NotAValidType",  # Should be "Point"
            "coordinates": [
                4.22,
                50.67
            ]
        }'
        ...
    },
    "validating_errors": {
        ...
        "my_charfield": "data was too long: 'this data is way too long for 10 characters'",
        ...
    }
}
class BaseSerializerLeanRmixin:
“”“在那些干净的字段中进行抽象混合。”“”
定义初始化(self,*args,**kwargs):
“”“初始化清洁策略。”“”
#这是要由“clean”字段名称填充的错误记录*`
self.cleaning_error_dict={}
super()
def清洁_字段(自身、数据):
“”“在验证之前,请清除self.fields\u至\u Clean中列出的字段。”“”
已清理的_数据={}
对于getattr(self.Meta,“fields”,[])中的字段名称:
已清除的\u字段=(
getattr(自身,“清除”+字段名称)(数据)
如果hasattr(自身,“清除”+字段名称)
else data.get(字段名称)
)
如果“已清除”字段不是“无”:
已清理的\u数据[字段\u名称]=已清理的\u字段
返回已清除的数据
def至_内部_值(自身、数据):
“”“重新格式化数据以将其放入数据库。”“”
已清理的\u数据=自清理的\u字段(数据)
将super()返回到\u内部\u值(已清理的\u数据)
我不确定这是一个好主意,也许有一个简单的方法来处理这些事情

第二个问题;捕获验证错误而不指定with
is\u valid()
返回
True
当没有主键格式错误时,我不确定如何继续