如何显示模型上不存在的 FileField - Django Rest Framework
How to display a FileField that doesn't exist on the model - Django Rest Framework
我正在使用 djangorestframework==3.0.3
所以我想显示模型上不存在的上传字段。我不想将上传的文件保存到模型中。我想单独处理。我用下面的代码得到这个错误 'XYZModelName' object has no attribute 'upload_file'.
class XYZSerializer(MyParentSerializer):
upload_file = serializers.FileField(use_url=False)
class Meta:
model = models.XYZModelName
fields = ('name', 'active', 'upload_file')
class XYZModelName(TrackedModel):
name = models.CharField(max_length=50)
active = models.BooleanField(default=False)
错误是因为我没有 upload_file 作为模型的属性。我不想 upload_file 在模型上。
如何在可浏览的 api 中显示该字段?
我还尝试创建自定义字段来覆盖 to_internal_value 和 to_representation 方法。
您需要在 returns URL 模型上定义一个函数(显然它需要与您的对象有某种关联)
def get_file_url(self):
return settings.STORAGE_LOCATION + 'some/path/' + str(self.pk) + '.png'
然后您可以在序列化程序中使用它,例如:
upload_file = serializers.FileField(source='get_file_url')
要在 POST 期间保存文件,您需要重写序列化程序的 create
方法,例如:
def create(self, validated_data):
file = validated_data['upload_file']
# save file code here
del validated_data['upload_file']
return XYZ.objects.create(**validated_data)
我正在使用 djangorestframework==3.0.3
所以我想显示模型上不存在的上传字段。我不想将上传的文件保存到模型中。我想单独处理。我用下面的代码得到这个错误 'XYZModelName' object has no attribute 'upload_file'.
class XYZSerializer(MyParentSerializer):
upload_file = serializers.FileField(use_url=False)
class Meta:
model = models.XYZModelName
fields = ('name', 'active', 'upload_file')
class XYZModelName(TrackedModel):
name = models.CharField(max_length=50)
active = models.BooleanField(default=False)
错误是因为我没有 upload_file 作为模型的属性。我不想 upload_file 在模型上。
如何在可浏览的 api 中显示该字段?
我还尝试创建自定义字段来覆盖 to_internal_value 和 to_representation 方法。
您需要在 returns URL 模型上定义一个函数(显然它需要与您的对象有某种关联)
def get_file_url(self):
return settings.STORAGE_LOCATION + 'some/path/' + str(self.pk) + '.png'
然后您可以在序列化程序中使用它,例如:
upload_file = serializers.FileField(source='get_file_url')
要在 POST 期间保存文件,您需要重写序列化程序的 create
方法,例如:
def create(self, validated_data):
file = validated_data['upload_file']
# save file code here
del validated_data['upload_file']
return XYZ.objects.create(**validated_data)