2017-08-08 142 views
1

我有型号产品:Django的REST框架图片上传

class Product(models.Model): 
    ... 
    image = models.ImageField(
     upload_to=lambda instance, filename: 'images/{0}/{1}'.format(instance.id, filename), 
     max_length=254, blank=True, null=True 
    ) 
    ... 

然后,我有串行:

class ProductSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = Product 
     fields = (
      ... 
      'image', 
      ... 
     ) 

然后我有意见:

class ProductViewSet(BaseViewSet, viewsets.ModelViewSet): 
    queryset = Product.objects.all() 
    serializer_class = ProductSerializer 

如何我可以上传图像与邮差?将图片上传到模型的最佳做法是什么?谢谢。

+1

删除paranthesis,'serializer_class = ProductSerializer' ..如果您使用的是'ModelViewSet',那么您不需要再写更多...'ViewSet'几乎可以处理所有的事情。 – zaidfazil

+0

好的,谢谢,我怎样才能用邮递员或一些Ajax请求上传图片? –

回答

2

您可以上传图片创建单独的终结点,这将是这样的:

class ProductViewSet(BaseViewSet, viewsets.ModelViewSet): 
    queryset = Product.objects.all() 
    serializer_class = ProductSerializer 

    @detail_route(methods=['post']) 
    def upload_docs(request): 
     try: 
      file = request.data['file'] 
     except KeyError: 
      raise ParseError('Request has no resource file attached') 
     product = Product.objects.create(image=file, ....) 

你可以去周围的解决方案

- 更新: 这是如何从邮递员上传 enter image description here

+0

谢谢。但是,我如何通过邮差上传图片? –

+1

您可以通过选择身体上的form-data并使用邮递员上传,并选择文件类型,然后点击选择文件,在关键字段 上输入'file',查看上面的更新。 –

+0

谢谢!我可以像'/ api/products/33/upload_docs'那样使用方法“PUT”来访问url吗? –