首页 > 解决方案 > django rest框架中的多文件上传

问题描述

在我解释我的问题之前,我只想提一下,我在 stackoverflow 和其他网站上进行了很多搜索,这就是我能够达到当前状态的方式

问题

  1. 我想上传多个文件

我为它创建了 2 个模型

第一个证据模型:其中有一个文件字段

class Evidence(TimeStampedModel):

    evidence_reviewer  = models.ForeignKey('EvidenceReviewer', on_delete=models.CASCADE,
                                related_name="evidence_evidencereviewer",null=True,blank=True)
    evidence_file = models.FileField("File Upload", blank=True, null=True)

2nd EvidenceReviewer 模型:其中包含我想要的其他字段

class EvidenceReviewer(TimeStampedModel):
    CONTROL_STATUS_CHOICES = (
        ('non_compliant', 'Non-Compliant'),
        ('attested', 'Attested'),
        ('compliant', 'Compliant'),
    )
    resource = models.ForeignKey('Asset', on_delete=models.CASCADE,#Resource
                                related_name="reviewer_resource")
    control = models.ForeignKey('Control', on_delete=models.CASCADE,#state _ctrl_id
                                 related_name="reviewer_control")
    remarks = models.TextField(blank=True, default="", null=True)#description
    current_state = StatusField("control state", choices_name='CONTROL_STATUS_CHOICES',
                                    default="non_compliant")

并且有各自的序列化器如下

证据序列化器

class EvidenceSerializer(serializers.ModelSerializer):

    class Meta:
        model = Evidence
        fields =  ('id','evidence_file')

EvidenceReviewSerializer

class EvidenceReviewerSerializer (serializers.ModelSerializer):
    evidence_file = EvidenceSerializer(many=True, required = False)


    class Meta:
        model = EvidenceReviewer
        fields =  ('resource','control','remarks','current_state','evidence_file ' )

    def create(self, validated_data):
        current_user = self.context["request"].user
        print("data:-",validated_data)
        # Story  contains images
        if 'evidence_file' in validated_data:
            evidence_files = validated_data.pop('evidence_file')

            evidence_reviewer_obj = EvidenceReviewer.objects.create(**validated_data)
            for file in evidence_files:
                Evidence.objects.create(**file, evidence_reviewer=evidence_reviewer_obj)
            return evidence_reviewer_obj

        # Story  is not containing images
        if 'evidence_file'not in validated_data:
            evidence_reviewer_obj = EvidenceReviewer.objects.create( **validated_data)
            return evidence_reviewer_obj

最后是我正在使用的视图集

class EvidenceReviewerViewset(viewsets.ModelViewSet):
    serializer_class = EvidenceReviewerSerializer

    http_method_names = ['post','delete','put','patch', 'head']

    queryset = EvidenceReviewer.objects.all()

我发布的数据 在此处输入图像描述

我收到的错误

{
    "evidence_file": [
        {
            "non_field_errors": [
                "Invalid data. Expected a dictionary, but got InMemoryUploadedFile."
            ]
        },
        {
            "non_field_errors": [
                "Invalid data. Expected a dictionary, but got InMemoryUploadedFile."
            ]
        }
    ]
}

我已按照@dan_boy 此处参考链接给出的答案

我被困在这里很长一段时间了,对于任何领导或指导,我都会非常满意

标签: pythondjango-rest-framework

解决方案


推荐阅读