我正在尝试使用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()