如何发布嵌套数据和图像列表

Sco*_*d77 9 post json curl imagefield django-rest-framework

有两种型号:ProductPicture.每个都Product可以有几个Picture.当我想使用POST创建产品时,我有疑问.如何POST一个包含ImageField列表的嵌套对象?

Product模型是:

class Product(models.Model):
    product_id = models.AutoField(primary_key=True)
    product_name = models.CharField(max_length=50)
    description = models.TextField(blank=True)
Run Code Online (Sandbox Code Playgroud)

Picture模型是:

class Picture(models.Model):
    product = models.ForeignKey(Product, related_name='pictures')
    path = models.ImageField(null=False, upload_to='product_pic')
    description = models.CharField(max_length=255, null=True, blank=True)
    main = models.BooleanField()
Run Code Online (Sandbox Code Playgroud)

我写了serializer.py如下:

class PictureSerializer(serializers.ModelSerializer):
    class Meta:
        model = Picture
        fields = ('path', 'description', 'main')

class ProductSerializer(serializers.ModelSerializer): 
    pictures = PictureSerializer(many=True, required=False)

    class Meta:
        model = Product
        fields = ('product_id', 'product_name', 'pictures', 'description')
Run Code Online (Sandbox Code Playgroud)

我使用的观点是:

class ProductEnum(generics.ListCreateAPIView):
    queryset = Product.objects.all()
    serializer_class = ProductSerializer
    permission_classes = (IsAuthenticated, )

    def post(self, request, format=None):
        serializer = ProductSerializer(data=request.DATA, files=request.FILES)

        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
Run Code Online (Sandbox Code Playgroud)

我正在网址中注册:

url(r'^api/products/$', views.ProductEnum.as_view()),
Run Code Online (Sandbox Code Playgroud)

问题是:

  • 我怎么能测试这个POST api django-rest-framework告诉我"HTML输入当前不支持列表"
  • 如何使用JSON来发布Product多个资源Pictures.或者我必须使用multipart解析器.
  • 如何编写cURL命令?

bel*_*lek 0

您可以使用manage.py shell。像这样:

import requests
r = requests.post("http://localhost:8000/login/url", data={"username": "username", "password": "password"}
r.content (outputs token)
token="yourtoken"
r = requests.post("http://localhost:8000/your/url", data={your POST data in json}, headers={"Authorization": "Token %s" % token})
Run Code Online (Sandbox Code Playgroud)