首页 > 解决方案 > “应为项目列表,但输入 \"str\"。” 在 django 休息框架中

问题描述

我有一个 addproduct api,其中前端在后 axios 调用中发送表单数据。使用formdata是因为有一个图片字段需要发送。

但我收到以下错误。

“需要一个项目列表,但输入的是“str”。” 在 django 休息框架中。

数据以如下形式发送,如下所示。

{

        "merchant": 8,
        "category": "[3,4]",
        "brand":2,
        "name":"pvahnjjthhgjhtest",
        "best_seller":true,
        "top_rated":false,        
        "collection":2,
        "description":"abc",
        "featured": false,            
        "availability": "in_stock",
        "warranty": "no_warranty",
        "rating":5,
        "main_product_image":null,            
        "services": "cash_on_delivery",
        "variants": "[1,2]"
    }

这里的主要问题是关于类别和变体。错误也显示在这两个字段中。由于前端正在发送表单数据,因此这两个字段作为字符串发送。现在如何在后端处理这两个字段?我需要的是 1 和 2 作为 pk 。

如何从字符串中获取 pks。我试过 json.load 但它不起作用。

我的模型:

class Variants(models.Model):
    
    product_id = models.CharField(max_length=70, default='OAXWRTZ_12C',blank=True)
    price = models.DecimalField(decimal_places=2, max_digits=20,default=500)
    size = models.CharField(max_length=50, choices=SIZE, default='not applicable',blank=True,null=True)
    color = models.CharField(max_length=70, default="not applicable",blank=True,null=True)
    variant_image = models.ImageField(upload_to="products/images", blank=True,null=True)
    thumbnail = ImageSpecField(source='variant_image',
                               processors=[ResizeToFill(100, 50)],
                               format='JPEG',
                               options={'quality': 60})
    quantity = models.IntegerField(default=10,blank=True,null=True)  # available quantity of given product
    variant_availability = models.CharField(max_length=70, choices=AVAILABILITY, default='available')

    class Meta:
        verbose_name_plural = "Variants"

    def __str__(self):
        return self.product_id

#产品型号

class Product(models.Model):
   
    merchant = models.ForeignKey(Seller,on_delete=models.CASCADE,blank=True,null=True)
    category = models.ManyToManyField(Category, blank=False)
    sub_category = models.ForeignKey(Subcategory, on_delete=models.CASCADE,blank=True,null=True)
    brand = models.ForeignKey(Brand, on_delete=models.CASCADE)
    collection = models.ForeignKey(Collection, on_delete=models.CASCADE)
    featured = models.BooleanField(default=False)  # is product featured?
    best_seller = models.BooleanField(default=False)
    top_rated = models.BooleanField(default=False)
    tags = TaggableManager(blank=True)  # tags mechanism
    name = models.CharField(max_length=150,unique=True)
    main_product_image = models.ImageField(upload_to="products/images", null=True, blank=True)
    thumbnail = ImageSpecField(source='main_product_image',
                               processors=[ResizeToFill(100, 50)],
                               format='JPEG',
                               options={'quality': 60})
    slug = models.SlugField(max_length=200,blank=True)       
    description = RichTextField(blank=True)
    #picture = models.ImageField(upload_to="products/images", null=True, blank=True)
    picture = models.ManyToManyField(ImageBucket,null=True,blank=True,verbose_name="Add extra 3 images")
    rating = models.IntegerField(choices=((1, 1),
                                               (2, 2),
                                               (3, 3),
                                               (4, 4),
                                               (5, 5))
                                      )
    availability = models.CharField(max_length=70, choices=AVAILABILITY, default='in_stock')
    warranty = models.CharField(max_length=100, choices=WARRANTY, default='no_warranty')
    services = models.CharField(max_length=100, choices=SERVICES, default='cash_on_delivery')
    variants = models.ManyToManyField(Variants,related_name='products')

我的观点:

class ProductAddAPIView(APIView):
    permission_classes = [IsAuthenticated]

    def post(self,request,*args,**kwargs):
        serializer = AddProductSerializer(data=request.data)
        if serializer.is_valid():
            return Response(serializer.data,{
                "message":"Product has been created"
            })
        return Response(serializer.errors)

更新代码:

数据现在通过以下方式发送:

name: TestNamae
category[0]: 7
category[1]: 23
brand: 7
collection: 11
availability: in_stock
warranty: no_warranty
service: cash_on_delivery
rating: 3
best_seller: true
top_rated: true
featured: true
main_product_image: (binary)
merchant: 2
variants[0][product_id]: fgfdg
variants[0][price]: 127
variants[0][quantity]: 1
variants[0][color]: red
variants[0][size]: M
variants[0][variant_availability]: not_available
variants[0][variant_image]: (binary)
variants[1][product_id]: fgfdg
variants[1][price]: 127
variants[1][quantity]: 1
variants[1][color]: red
variants[1][size]: M
variants[1][variant_availability]: not_available
variants[1][variant_image]: (binary)

但是当这样发送时,它说该类别是必需的,但是当它在列表 [1,2] 中发送时它可以工作。数据需要以这种方式发送,因为数组内部有图像字段,所以要使用Multipart形式。

这个怎么解决??

标签: jsondjangoapidjango-rest-frameworkform-data

解决方案


推荐阅读