我正在尝试使用 Angular 插件保存上传到 Django Rest Framework 3.0 API 的文件 ng-file-upload 。这是 Angular 中非常流行的插件,由于浏览器纯度的原因,上传时非常痛苦。
该插件要求文件在 header 中称为"file",因此在 Django 端,我尝试将该"file"与模型中的正确字段关联起来,该字段恰好是“照片”。
我正在尝试使用 DRF 的新 perform_update
Hook 将上传的"file"复制到“照片”字段。但是,唉,我做不到。要么我的Python在一些非常基本的层面上是错误的(这是可能的答案),要么perform_update Hook 中的序列化器对象是只读的,或者其他什么。我对序列化器对象所做的任何事情似乎都没有产生任何影响,并且我无法保存文件。
顺便说一句,我可以使用 DRF 自己的 Web 界面很好地保存文件。只是不是用我自己的 Angular 应用程序。
相关 Django:
class Entity(models.Model):
name = models.CharField("Entity Name", max_length=100, unique=True)
description = models.TextField(blank=True)
photo = models.ImageField(blank=True,upload_to='entity_images')
class EntityViewSet(UnCachedModelViewSet):
queryset = Entity.objects.all().order_by('name')
filter_fields = ('user','slug')
# parser_classes = (MultiPartParser,) #makes no difference
def perform_update(self, serializer):
if 'file' in self.request.data:
serializer.data['photo'] = self.request.data['file']
print('SERIALIZER: ',serializer.data) #for test purposes only
serializer.save()
无论我对serializer.data做什么,当我在下一行中打印它时,它看起来都是一样的,就好像它是只读的或者什么的。无论如何,文件永远不会保存到照片字段。
我的做法是错误的吗?如何使用perform_update
?
PS Angular=>Django 文件上传难题的基本方法来自 here ,但该解决方案中使用的 DRF pre_save
Hook 已被最新版本的 DRF 中的 perform_update
取代,如 here 所示。 .
附加包括工作答案:
def perform_update(self, serializer):
if 'file' in self.request.data:
serializer.save(photo= self.request.data['file'])
else:
serializer.save()
最佳答案
试试这个:
serializer.save(photo=self.request.data['file'])
请告诉我......
关于django - 从 Angular 前端在 Django Rest Framework 3.0 中保存上传的文件时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30011992/