无法在 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'])

让我知道....