Ошибка при обновлении нескольких объектов с использованием Django rest_framework сериализаторов - PullRequest
0 голосов
/ 24 марта 2020

Я делаю API для заказа, который может иметь несколько продуктов. Я могу создать его успешно, но когда я пытаюсь обновить его с помощью идентификатора еды, я получаю сообщение об ошибке, например, объект 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

My 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 Я передаю идентификатор поэтому он обновит 1-й и 2-й объект. У объекта 3 нет идентификатора, поэтому он создаст третий объект. Но я получаю сообщение об ошибке примерно так:

У объекта NoneType нет атрибута 'get'.

Какую ошибку я делаю?

1 Ответ

0 голосов
/ 24 марта 2020

Проблема здесь:

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...