json - “应为项目列表,但输入 \"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形式。
这个怎么解决??
解决方案
推荐阅读
- java - 在 Java 中解析 .proto 文件
- javascript - 使用回调查询多个 Promise
- ios - SwiftUI 使用 EnvironmentObject 作为我的 ViewModel 的模型
- firebase - 如何限制用户在 Firebase 实时数据库中上传一定数量的数据
- javascript - 计算画布中两个“像素斑点”之间的最小距离
- azure-machine-learning-service - Influx DB 作为 MLS 的源作为直接连接
- flutter - Flutter:从未来函数和数组中计算值时出现红屏
- keras - Keras 在使用 model.fit() 时如何计算验证指标?
- javascript - 获取图像 4 个角的 x,y 坐标
- bash - 用awk计算滑动窗口的中位数