【问题标题】:Cannot generate post request for multiple data无法为多个数据生成发布请求
【发布时间】:2019-10-18 06:27:03
【问题描述】:

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

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()),

【问题讨论】:

    标签: django-rest-framework


    【解决方案1】:

    当您致电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(...)
    
    

    【讨论】:

    • 感谢广武。 bulk_create 仅在没有任何相关数据字段时才有效。所以,我在 views.py 中使用了 for 循环。现在它的工作。 :)
    猜你喜欢
    • 2021-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-17
    相关资源
    最近更新 更多