文件上传使用drf序列化注意事项
假如文件字段的数据是
{
"id": 1,
"name": test,
"file": /media/xxxxxxx/test.txt
})
序列化器要添加context={"request": request}返回的字段信息才是 (后端域名 + 文件路径)
ser = StockItemImpWorkSerializer(instance, context={"request": request})
上下文
###########
## serializers
###########
class StockItemImpWorkFileSerializer(serializers.ModelSerializer):
class Meta:
model = StockItemImprovementWorkFile
fields = ["id","name", "file"]
class StockItemImpWorkSerializer(serializers.ModelSerializer):
files = StockItemImpWorkFileSerializer(many=True, read_only=True)
class Meta:
model = StockItemImprovementWork
fields = ["id", "stock_item","stock_code","doc_name","description","complete","invalid","file","version","deleted","files"]
##########
## models
##########
def improvementWorkUploadTo(instance, filename):
return '/'.join(
[
'eformFile',
hashlib.sha256(
str(DateTime.now()).encode()
).hexdigest(),
filename
]
)
class StockItemImprovementWork(models.Model):
stock_item = models.ForeignKey(
"cews.StockItem", on_delete=models.DO_NOTHING
)
stock_code = models.CharField(max_length=255, default='')
doc_name = models.CharField(max_length=100)
description = models.CharField(max_length=255, default='')
complete = models.IntegerField(default=0)
invalid = models.IntegerField(default=0)
file = models.FileField(upload_to=improvementWorkUploadTo, null=True, blank=True)
version = models.CharField(default="", max_length=255)
deleted = models.BooleanField(default=False)
class StockItemImprovementWorkFile(models.Model):
work = models.ForeignKey(StockItemImprovementWork,related_name='files', on_delete=models.CASCADE)
name = models.CharField(max_length=500, default="")
file = models.FileField(upload_to=improvementWorkUploadTo)