Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在Django Rest框架中,如何将FilelField的表示作为其内容覆盖?_Python_Django_Django Rest Framework - Fatal编程技术网

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