2017-08-08 148 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嗎? –