无法在 Django Rest Framework 3.0 中保存上传的文件,来自 Angular 前端
Trouble saving uploaded files in Django Rest Framework 3.0, from Angular front end
我正在尝试使用 Angular 插件 ng-file-upload 保存上传到 Django Rest Framework 3.0 API 的文件。这是 Angular 中非常流行的插件,由于浏览器纯度的原因,上传时非常痛苦。
该插件要求文件在 headers 中被称为 "file",因此在 Django 方面,我试图将 "file" 与模型中的正确字段相关联,恰好是 "photo".
我正在尝试使用 DRF 的新 perform_update
挂钩将上传的 "file" 复制到 "photo" 字段。但是,唉,我做不到。要么我的 Python 在某些非常基本的层面上是错误的(这可能是答案),要么 perform_update
挂钩中的序列化器 object 是只读的,或者其他什么。我对序列化器所做的任何事情 object 似乎都没有什么不同,我无法保存文件。
顺便说一句,我可以使用 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 做什么,当我在下一行打印它时,它看起来都一样,就好像它是 read-only 之类的。无论如何,文件永远不会保存到照片字段。
我是不是完全错了?你如何使用perform_update
?
PS Angular=>Django 文件上传难题的基本方法来自 here, but the DRF pre_save
hook used in that solution has been replaced by perform_update
in the latest version of DRF, as per 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'])
让我知道....
我正在尝试使用 Angular 插件 ng-file-upload 保存上传到 Django Rest Framework 3.0 API 的文件。这是 Angular 中非常流行的插件,由于浏览器纯度的原因,上传时非常痛苦。
该插件要求文件在 headers 中被称为 "file",因此在 Django 方面,我试图将 "file" 与模型中的正确字段相关联,恰好是 "photo".
我正在尝试使用 DRF 的新 perform_update
挂钩将上传的 "file" 复制到 "photo" 字段。但是,唉,我做不到。要么我的 Python 在某些非常基本的层面上是错误的(这可能是答案),要么 perform_update
挂钩中的序列化器 object 是只读的,或者其他什么。我对序列化器所做的任何事情 object 似乎都没有什么不同,我无法保存文件。
顺便说一句,我可以使用 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 做什么,当我在下一行打印它时,它看起来都一样,就好像它是 read-only 之类的。无论如何,文件永远不会保存到照片字段。
我是不是完全错了?你如何使用perform_update
?
PS Angular=>Django 文件上传难题的基本方法来自 here, but the DRF pre_save
hook used in that solution has been replaced by perform_update
in the latest version of DRF, as per 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'])
让我知道....