无法为多个数据生成发布请求

时间:2019-10-18 06:27:03

标签: django-rest-framework

我正在尝试在后期请求中获取多个输入数据对象,但出现这种错误。

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

models.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)

serializers.py

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__'

views.py

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)

urls.py

path('orderproduct/',views.OrderProductList.as_view()),

1 个答案:

答案 0 :(得分:0)

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

serializers.py

    def create(self, validate_data):
       # Get the data objects you need to perform bulk create
       order_products = OrderProduct.objects.bulk_create(validate_data)
       return order_products

views.py

    if serializer.is_valid(raise_exception=True):
       # Replace the serializer.save() by this line to trigger the create method in serializer
       self.perform_create(serializer)
       return Response(...)