python - django rest框架中的多文件上传
问题描述
在我解释我的问题之前,我只想提一下,我在 stackoverflow 和其他网站上进行了很多搜索,这就是我能够达到当前状态的方式
问题
- 我想上传多个文件
我为它创建了 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 此处参考链接给出的答案
我被困在这里很长一段时间了,对于任何领导或指导,我都会非常满意
解决方案
推荐阅读
- azure - Azure SQL 数据库的可视化查询设计器?
- python - 是否可以删除输出文件的行?
- html - 我需要以某种方式定位文本的背景
- javascript - 与 GitHub API 用户名搜索相关的函数出现问题
- python - 如何根据分隔符或短语拆分文本列行并在每次拆分时保留名称?
- typescript - ExpressJS:如何将转译的 .js 文件包含在 HTML 中作为静态资源
- reactjs - Redux 正在为映射数组中的所有元素设置重复值
- android - 是否有任何功能可以检测视频是否使用 webview 完成?
- python - 按日期和类别分组的计数器功能
- android - Android Spinner 下拉菜单在向上/向下滚动期间随机丢失项目