[ django文件上传 ]


文件上传使用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)