Django rest framework 无法为多个数据生成post请求

Django rest framework 无法为多个数据生成post请求,django-rest-framework,Django Rest Framework,我试图在post请求中输入多个数据对象,但得到这样的错误 non_field_errors: [ Invalid data. Expected a dictionary, but got a list. ] 型号.py class OrderProduct(BaseModel): product = models.ForeignKey(Product,on_delete=models.CASCADE) order = models.ForeignKey(Order,on

我试图在post请求中输入多个数据对象,但得到这样的错误

non_field_errors: [ Invalid data. Expected a dictionary, but got a list.     ]
型号.py

class OrderProduct(BaseModel):
    product = models.ForeignKey(Product,on_delete=models.CASCADE)
    order = models.ForeignKey(Order,on_delete=models.CASCADE)
    order_product_price = models.FloatField(blank=False,null=False,default=0)  # product may belong to offer do the price
    order_product_qty = models.FloatField(default=1)
class OrderProductSerializer(serializers.ModelSerializer):

     def update(self,instance,validated_data):
        product = self.validated_data.pop('product')
        order = self.validated_data.pop('order')

        instance.orderproduct_qty = 
        self.validated_data.get('orderproduct_qty',instance.orderproduct_qty)
        instance.product = product
        instance.order = order
        instance.save()
        return instance

     class Meta:
        model = OrderProduct
        fields = '__all__'
def post(self,request,*args,**kwargs):
    if request.data['contact_number'] == '':
        request.POST._mutable =True
        request.data['contact_number'] = request.user.mobile_number
        request.POST._mutable = False
    serializer = OrderSerializer(data=request.data,many=isinstance(request.data,list),context={'request': request})
    print(serializer)
    if serializer.is_valid():
        serializer.save(user = request.user,created_by = request.user)
        return Response(serializer.data,status=status.HTTP_200_OK)
    else:
        return Response(serializer.errors,status=status.HTTP_400_BAD_REQUEST)
path('orderproduct/',views.OrderProductList.as_view()),
序列化程序.py

class OrderProduct(BaseModel):
    product = models.ForeignKey(Product,on_delete=models.CASCADE)
    order = models.ForeignKey(Order,on_delete=models.CASCADE)
    order_product_price = models.FloatField(blank=False,null=False,default=0)  # product may belong to offer do the price
    order_product_qty = models.FloatField(default=1)
class OrderProductSerializer(serializers.ModelSerializer):

     def update(self,instance,validated_data):
        product = self.validated_data.pop('product')
        order = self.validated_data.pop('order')

        instance.orderproduct_qty = 
        self.validated_data.get('orderproduct_qty',instance.orderproduct_qty)
        instance.product = product
        instance.order = order
        instance.save()
        return instance

     class Meta:
        model = OrderProduct
        fields = '__all__'
def post(self,request,*args,**kwargs):
    if request.data['contact_number'] == '':
        request.POST._mutable =True
        request.data['contact_number'] = request.user.mobile_number
        request.POST._mutable = False
    serializer = OrderSerializer(data=request.data,many=isinstance(request.data,list),context={'request': request})
    print(serializer)
    if serializer.is_valid():
        serializer.save(user = request.user,created_by = request.user)
        return Response(serializer.data,status=status.HTTP_200_OK)
    else:
        return Response(serializer.errors,status=status.HTTP_400_BAD_REQUEST)
path('orderproduct/',views.OrderProductList.as_view()),
视图.py

class OrderProduct(BaseModel):
    product = models.ForeignKey(Product,on_delete=models.CASCADE)
    order = models.ForeignKey(Order,on_delete=models.CASCADE)
    order_product_price = models.FloatField(blank=False,null=False,default=0)  # product may belong to offer do the price
    order_product_qty = models.FloatField(default=1)
class OrderProductSerializer(serializers.ModelSerializer):

     def update(self,instance,validated_data):
        product = self.validated_data.pop('product')
        order = self.validated_data.pop('order')

        instance.orderproduct_qty = 
        self.validated_data.get('orderproduct_qty',instance.orderproduct_qty)
        instance.product = product
        instance.order = order
        instance.save()
        return instance

     class Meta:
        model = OrderProduct
        fields = '__all__'
def post(self,request,*args,**kwargs):
    if request.data['contact_number'] == '':
        request.POST._mutable =True
        request.data['contact_number'] = request.user.mobile_number
        request.POST._mutable = False
    serializer = OrderSerializer(data=request.data,many=isinstance(request.data,list),context={'request': request})
    print(serializer)
    if serializer.is_valid():
        serializer.save(user = request.user,created_by = request.user)
        return Response(serializer.data,status=status.HTTP_200_OK)
    else:
        return Response(serializer.errors,status=status.HTTP_400_BAD_REQUEST)
path('orderproduct/',views.OrderProductList.as_view()),
url.py

class OrderProduct(BaseModel):
    product = models.ForeignKey(Product,on_delete=models.CASCADE)
    order = models.ForeignKey(Order,on_delete=models.CASCADE)
    order_product_price = models.FloatField(blank=False,null=False,default=0)  # product may belong to offer do the price
    order_product_qty = models.FloatField(default=1)
class OrderProductSerializer(serializers.ModelSerializer):

     def update(self,instance,validated_data):
        product = self.validated_data.pop('product')
        order = self.validated_data.pop('order')

        instance.orderproduct_qty = 
        self.validated_data.get('orderproduct_qty',instance.orderproduct_qty)
        instance.product = product
        instance.order = order
        instance.save()
        return instance

     class Meta:
        model = OrderProduct
        fields = '__all__'
def post(self,request,*args,**kwargs):
    if request.data['contact_number'] == '':
        request.POST._mutable =True
        request.data['contact_number'] = request.user.mobile_number
        request.POST._mutable = False
    serializer = OrderSerializer(data=request.data,many=isinstance(request.data,list),context={'request': request})
    print(serializer)
    if serializer.is_valid():
        serializer.save(user = request.user,created_by = request.user)
        return Response(serializer.data,status=status.HTTP_200_OK)
    else:
        return Response(serializer.errors,status=status.HTTP_400_BAD_REQUEST)
path('orderproduct/',views.OrderProductList.as_view()),

调用
serializer.save()
时。它只是执行
create()
操作,该操作仅创建一个并仅接受字典数据类型。如果您想像那样保存多个数据,则必须重写序列化程序类的
create
函数。您可以执行类似的操作或运行for循环

序列化程序.py

class OrderProduct(BaseModel):
    product = models.ForeignKey(Product,on_delete=models.CASCADE)
    order = models.ForeignKey(Order,on_delete=models.CASCADE)
    order_product_price = models.FloatField(blank=False,null=False,default=0)  # product may belong to offer do the price
    order_product_qty = models.FloatField(default=1)
class OrderProductSerializer(serializers.ModelSerializer):

     def update(self,instance,validated_data):
        product = self.validated_data.pop('product')
        order = self.validated_data.pop('order')

        instance.orderproduct_qty = 
        self.validated_data.get('orderproduct_qty',instance.orderproduct_qty)
        instance.product = product
        instance.order = order
        instance.save()
        return instance

     class Meta:
        model = OrderProduct
        fields = '__all__'
def post(self,request,*args,**kwargs):
    if request.data['contact_number'] == '':
        request.POST._mutable =True
        request.data['contact_number'] = request.user.mobile_number
        request.POST._mutable = False
    serializer = OrderSerializer(data=request.data,many=isinstance(request.data,list),context={'request': request})
    print(serializer)
    if serializer.is_valid():
        serializer.save(user = request.user,created_by = request.user)
        return Response(serializer.data,status=status.HTTP_200_OK)
    else:
        return Response(serializer.errors,status=status.HTTP_400_BAD_REQUEST)
path('orderproduct/',views.OrderProductList.as_view()),
def创建(自我、验证数据):
#获取执行批量创建所需的数据对象
order\u products=OrderProduct.objects.bulk\u创建(验证数据)
退货订单和产品
视图.py

class OrderProduct(BaseModel):
    product = models.ForeignKey(Product,on_delete=models.CASCADE)
    order = models.ForeignKey(Order,on_delete=models.CASCADE)
    order_product_price = models.FloatField(blank=False,null=False,default=0)  # product may belong to offer do the price
    order_product_qty = models.FloatField(default=1)
class OrderProductSerializer(serializers.ModelSerializer):

     def update(self,instance,validated_data):
        product = self.validated_data.pop('product')
        order = self.validated_data.pop('order')

        instance.orderproduct_qty = 
        self.validated_data.get('orderproduct_qty',instance.orderproduct_qty)
        instance.product = product
        instance.order = order
        instance.save()
        return instance

     class Meta:
        model = OrderProduct
        fields = '__all__'
def post(self,request,*args,**kwargs):
    if request.data['contact_number'] == '':
        request.POST._mutable =True
        request.data['contact_number'] = request.user.mobile_number
        request.POST._mutable = False
    serializer = OrderSerializer(data=request.data,many=isinstance(request.data,list),context={'request': request})
    print(serializer)
    if serializer.is_valid():
        serializer.save(user = request.user,created_by = request.user)
        return Response(serializer.data,status=status.HTTP_200_OK)
    else:
        return Response(serializer.errors,status=status.HTTP_400_BAD_REQUEST)
path('orderproduct/',views.OrderProductList.as_view()),
如果序列化程序有效(raise\U exception=True):
#将serializer.save()替换为此行,以触发serializer中的create方法
self.perform\u创建(序列化程序)
返回响应(…)

当您调用
serializer.save()时。它只是执行
create()
操作,该操作仅创建一个并仅接受字典数据类型。如果您想像那样保存多个数据,则必须重写序列化程序类的
create
函数。您可以执行类似的操作或运行for循环

序列化程序.py

class OrderProduct(BaseModel):
    product = models.ForeignKey(Product,on_delete=models.CASCADE)
    order = models.ForeignKey(Order,on_delete=models.CASCADE)
    order_product_price = models.FloatField(blank=False,null=False,default=0)  # product may belong to offer do the price
    order_product_qty = models.FloatField(default=1)
class OrderProductSerializer(serializers.ModelSerializer):

     def update(self,instance,validated_data):
        product = self.validated_data.pop('product')
        order = self.validated_data.pop('order')

        instance.orderproduct_qty = 
        self.validated_data.get('orderproduct_qty',instance.orderproduct_qty)
        instance.product = product
        instance.order = order
        instance.save()
        return instance

     class Meta:
        model = OrderProduct
        fields = '__all__'
def post(self,request,*args,**kwargs):
    if request.data['contact_number'] == '':
        request.POST._mutable =True
        request.data['contact_number'] = request.user.mobile_number
        request.POST._mutable = False
    serializer = OrderSerializer(data=request.data,many=isinstance(request.data,list),context={'request': request})
    print(serializer)
    if serializer.is_valid():
        serializer.save(user = request.user,created_by = request.user)
        return Response(serializer.data,status=status.HTTP_200_OK)
    else:
        return Response(serializer.errors,status=status.HTTP_400_BAD_REQUEST)
path('orderproduct/',views.OrderProductList.as_view()),
def创建(自我、验证数据):
#获取执行批量创建所需的数据对象
order\u products=OrderProduct.objects.bulk\u创建(验证数据)
退货订单和产品
视图.py

class OrderProduct(BaseModel):
    product = models.ForeignKey(Product,on_delete=models.CASCADE)
    order = models.ForeignKey(Order,on_delete=models.CASCADE)
    order_product_price = models.FloatField(blank=False,null=False,default=0)  # product may belong to offer do the price
    order_product_qty = models.FloatField(default=1)
class OrderProductSerializer(serializers.ModelSerializer):

     def update(self,instance,validated_data):
        product = self.validated_data.pop('product')
        order = self.validated_data.pop('order')

        instance.orderproduct_qty = 
        self.validated_data.get('orderproduct_qty',instance.orderproduct_qty)
        instance.product = product
        instance.order = order
        instance.save()
        return instance

     class Meta:
        model = OrderProduct
        fields = '__all__'
def post(self,request,*args,**kwargs):
    if request.data['contact_number'] == '':
        request.POST._mutable =True
        request.data['contact_number'] = request.user.mobile_number
        request.POST._mutable = False
    serializer = OrderSerializer(data=request.data,many=isinstance(request.data,list),context={'request': request})
    print(serializer)
    if serializer.is_valid():
        serializer.save(user = request.user,created_by = request.user)
        return Response(serializer.data,status=status.HTTP_200_OK)
    else:
        return Response(serializer.errors,status=status.HTTP_400_BAD_REQUEST)
path('orderproduct/',views.OrderProductList.as_view()),
如果序列化程序有效(raise\U exception=True):
#将serializer.save()替换为此行,以触发serializer中的create方法
self.perform\u创建(序列化程序)
返回响应(…)

谢谢Quang Võ。bulk_create仅在没有任何相关数据字段的情况下才有效。因此,我在views.py中使用了for循环。现在可以工作了。:)谢谢广维。bulk_create仅在没有任何相关数据字段的情况下才有效。因此,我在views.py中使用了for循环。现在可以工作了。:)