基本上,我有一个FileField,在创建时,其他字段由从该文件中提取的数据填充。
我的模型的某些字段具有非空约束(要从这些字段的文件中提取值 )。
我正在使用ModelSerializer
和drf字段将allow_null
添加到字段中(我的模型中为null=False
),因为我知道Order of Serializer Validation in Django REST Framework。
问题是我希望它们是只读的(我只想要一个带有文件输入的表单,记得吗?)并根据drf文档: 只读字段包含在API输出中,但在创建或更新操作期间不应包含在输入中。
因此我有时必须在这些字段中放置随机值,以便通过验证阶段,即使这些字段将由正确的值(从文件中提取)填充后。
如何忽略模型中的非null约束,并在序列化程序中只读取字段(不更改模型)?
答案 0 :(得分:0)
这里有一个设计问题:你强迫序列化程序执行一些控制器的工作。我的建议是你将覆盖视图的创建方法,在那里你将构建你的业务逻辑:
这种方法使您仍然可以在不违反责任链的情况下仅向客户请求POST。并保持序列化器清洁简单。
有道理吗?
答案 1 :(得分:0)
我安全删除了我的默认验证(validators = []
),因为在这种特殊情况下,我必须编写整个验证过程(从我的FileField导出所有数据以填充其他数据) )。
这使我的序列化程序能够通过save方法完成其工作,而不会引发验证错误,我在非空字段中添加了我文件中的导出数据。
def save(self, **kwargs):
...
self.validated_data['my-non-null-field'] = value