使用Django rest_framework序列化程序更新多个对象时出错

问题描述 投票:0回答:1

我正在为可以包含多种食物的订单制作API。我能够成功创建它,但是当我尝试更新食物ID时,出现类似NoneType对象没有属性“ get”的错误。

这是我的代码:

models.py

class Order(models.Model):
    order_no = models.PositiveIntegerField(blank=True,null=True)

class VegFood(models.Model):
    name = models.CharField(max_length=25,blank=True,null=True)
    price = models.CharField(max_length=25,blank=True,null=True)
    order = models.ForeignKey(Order,on_delete=models.CASCADE,blank=True,null=True,related_name="order")

serializers.py

class VegFoodSerializer(serializers.ModelSerializer):
    class Meta:
        model = VegFood
        fields = ['name','price']
class OrderSerializer(serializers.ModelSerializer):
    """
    for multiple add items importinf serializers in Order
    """
    veg_foods = VegFoodSerializer(many=True,required=False)
    nonveg_foods = NonVegFoodSerializer(many=True,required=False)
    starters = StarterSerializer(many=True,required=False)
    deserts = DesertSerializer(many=True,required=False)

    class Meta:
        model = Order
        fields = ['order_no','veg_foods','nonveg_foods','starters','deserts']

    def create(self, validated_data):
        veg_food_validated_data = validated_data.pop('veg_foods',None)

        if veg_food_validated_data:
            for veg_food in veg_food_validated_data:
                veg_food_obj = VegFood.objects.create(order=orders,**veg_food)

        return orders

    def update(self, instance, validated_data):
        instance.order_no = validated_data.pop('order_no', instance.order_no)
        veg_food_validated_data = validated_data.pop('veg_foods',None)
        if veg_food_validated_data:
            for veg_food in veg_food_validated_data:
                veg_food_id = veg_food.get('veg_food_id')
                print(veg_food_id)
                veg_foods, created = VegFood.objects.get_or_create(order_id=instance.id,id=veg_food_id)
                veg_foods.name = veg_food_id.get('name',None)
                veg_foods.price = veg_food_id.get('price',None)
                veg_foods.save()
        instance.save()
        return instance

我的JSON正文为:

{
  "order_no":1,
  "veg_foods":[
          {
            "veg_food_id":1,
            "name":curry1,
            "price":150
          },
          {
            "veg_food_id":2,
            "name":curry2,
            "price":120
          },
          {
            "name":curry2,
            "price":120
          }
    ]
}

所以object1&object2我正在传递id,因此它将更新第1个和第2个对象。对象3没有ID,因此它将创建第三个对象。但是我收到这样的错误:

NoneType对象没有属性'get'。

我在做什么错?

django django-models django-rest-framework django-views django-serializer
1个回答
0
投票

问题在这里:

veg_food_id = veg_food.get('veg_food_id')
veg_foods.name = veg_food_id.get('name',None)

您已经针对第三个对象说的veg_food.get('veg_food_id')None。您遇到的错误是有道理的。相反,您应该使用veg_food.get('name')或使用update_or_create来处理它。

veg_food_id = veg_food.pop('veg_food_id', None)
veg_foods, created = VegFood.objects.update_or_create(order_id=instance.id, id=veg_food_id, defaults=veg_food)
© www.soinside.com 2019 - 2024. All rights reserved.