Python 在Django Rest框架中,如何将FilelField的表示作为其内容覆盖?
假设我正在尝试序列化一个如下所示的Python 在Django Rest框架中,如何将FilelField的表示作为其内容覆盖?,python,django,django-rest-framework,Python,Django,Django Rest Framework,假设我正在尝试序列化一个如下所示的配置模型: class Configuration(models.Model): name = models.CharField() data = models.FileField() 数据是前端应用程序需要知道的用于表示目的的数据,但对后端没有用处。我希望它的序列化表示以字符串形式接受并返回数据的内容,但是数据的内容实际存储在文件中,因为它与后端应用程序无关。以下是我得到的: class DataField(serializers.FileF
配置
模型:
class Configuration(models.Model):
name = models.CharField()
data = models.FileField()
数据
是前端应用程序需要知道的用于表示目的的数据,但对后端没有用处。我希望它的序列化表示以字符串形式接受并返回数据
的内容,但是数据
的内容实际存储在文件中,因为它与后端应用程序无关。以下是我得到的:
class DataField(serializers.FileField):
def to_internal_value(self, data):
try:
return data.read()
except Exception as e: # not really sure what could turn up here
raise ValidationError(e)
class ForecastConfigSerializer(serializers.ModelSerializer):
data = DataField()
class Meta:
model = Configuration
fields = ('data', 'name',)
当django.db.models.fields.files要保存时,这给我带来了一个问题:
“bytes”对象没有属性“\u committed”
公平地说,当我阅读数据时,我可能把的值弄糟了。我认为它可以序列化实例,但不能从序列化数据创建实例
那我该怎么做呢?models.py:
序列化程序.py
您需要根据逻辑或使用代码段生成新文件名
希望有帮助您是想在保存时覆盖文件数据
还是只想排除错误消息?保存时覆盖。因此,从API消费者的角度来看,他们以字符串的形式发送和接收数据(在json响应中),但从后端的角度来看,数据存储在文件中。
class Configuration(models.Model):
name = models.CharField()
data = models.FileField()
@property
def data_src(self):
return self.data.read() if self.data else ''
from django.core.files.base import ContentFile
class ForecastConfigSerializer(serializers.ModelSerializer):
data = serializers.CharField(source='data_src', read_only=True)
class Meta:
model = Configuration
fields = ('data', 'name',)
def create(self, validated_data):
data_src = validated_data.pop('data_src')
instance = super(ForecastConfigSerializer, self).create(validated_data)
request = self.context.get('request')
f = ContentFile(data_src if data_src else '')
# generate new file name by your logic
new_file_name = 'CHANGE_IT.json'
instance.data.save(new_file_name, f)
return instance