无法从Angular前端保存Django Rest Framework 3.0中上传的文件

时间:2015-05-03 08:59:35

标签: django angularjs django-rest-framework

我正在尝试使用Angular插件ng-file-upload保存上传到Django Rest Framework 3.0 API的文件。这是Angular中一个非常受欢迎的插件,出于浏览器纯度的原因,在上传时会非常痛苦。

该插件需要调用该文件" file"在标题中,所以在Django方面,我试图将那个"文件"使用模型中的正确字段,恰好是"照片"。

我正在尝试使用DRF的新perform_update挂钩来复制上传的"文件"穿过"照片"领域。但是,唉,我不能这样做。要么我的Python在某个非常基本的级别(这是可能的答案)是错误的,或者perform_update钩子中的序列化程序对象是只读的,或者其他什么。我对序列化程序对象所做的一切似乎都有所不同,我无法保存文件。

顺便说一句,我可以使用DRF自己的网络界面保存文件。只是没有我自己的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钩子最近被perform_update取代DRF的版本,根据here

附上包含工作答案:

def perform_update(self, serializer):
    if 'file' in self.request.data:
        serializer.save(photo= self.request.data['file'])
    else:
        serializer.save()

0 个答案:

没有答案