我正在为可以包含多种食物的订单制作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'。
我在做什么错?
问题在这里:
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)