如何忽略非空约束并使用DRF字段使我的字段只读?

时间:2015-10-26 17:38:35

标签: django django-models django-rest-framework

基本上,我有一个FileField,在创建时,其他字段由从该文件中提取的数据填充。

我的模型的某些字段具有非空约束(要从这些字段的文件中提取值 )。

我正在使用ModelSerializer和drf字段将allow_null添加到字段中(我的模型中为null=False),因为我知道Order of Serializer Validation in Django REST Framework

问题是我希望它们是只读的(我只想要一个带有文件输入的表单,记得吗?)并根据drf文档: 只读字段包含在API输出中,但在创建或更新操作期间不应包含在输入中。

因此我有时必须在这些字段中放置随机值,以便通过验证阶段,即使这些字段将由正确的值(从文件中提取)填充后。

如何忽略模型中的非null约束,并在序列化程序中只读取字段(不更改模型)?

2 个答案:

答案 0 :(得分:0)

这里有一个设计问题:你强迫序列化程序执行一些控制器的工作。我的建议是你将覆盖视图的创建方法,在那里你将构建你的业务逻辑:

  • 在请求中接收文件;验证它的类型和内容
  • 以顺序(低内存占用!)方式解析文件
  • 提取您的"其他字段"数据
  • 在这个阶段你可以调用你的序列化器,它的所有字段都正确地映射到dB中的模型;将任何验证委托给他,以及模型创建/更新;

这种方法使您仍然可以在不违反责任链的情况下仅向客户请求POST。并保持序列化器清洁简单。

有道理吗?

答案 1 :(得分:0)

安全删除了我的默认验证(validators = []),因为在这种特殊情况下,我必须编写整个验证过程(从我的FileField导出所有数据以填充其他数据) )。

这使我的序列化程序能够通过save方法完成其工作,而不会引发验证错误,我在非空字段中添加了我文件中的导出数据。

 def save(self, **kwargs):
     ...
     self.validated_data['my-non-null-field'] = value
相关问题