Meal, created = Meal.objects.get_or_create(name=meal_data.get('name', '')) AttributeError: объект 'str' не имеет атрибута 'get'

Это django rest_framework api Я создал этот api для ресторана. Это menu api. Я хочу сохранить данные menu.json в мою базу данных, но у меня не получается. Можете ли вы дать какой-нибудь совет по сохранению данных json в мои модели. Я получил эту ошибку:

      File "C:\Users\OSMAN MERT\Desktop\menu\menu_core\api\models.py", line 36, in store_json_data
        meal, created = Meal.objects.get_or_create(name=meal_data.get('name', ''))
    AttributeError: 'str' object has no attribute 'get'

Как я могу решить эту проблему? Мне нужна ваша помощь?

models.py

    from django.db import models
    import json
    # Create your models here.
    
    class Meal(models.Model):
        id = models.AutoField(primary_key=True)
        name = models.CharField(max_length=100)
        is_vegetarian = models.BooleanField(default=False)
        is_vegan = models.BooleanField(default=False)
    
    class Ingredient(models.Model):
        id = models.AutoField(primary_key=True)
        name = models.CharField(max_length=100)
        groups = models.CharField(max_length=100)
    
    class Option(models.Model):
        id = models.AutoField(primary_key=True)
        ingredient = models.ForeignKey(Ingredient, on_delete=models.CASCADE)
        name = models.CharField(max_length=100)
        quality = models.CharField(max_length=100)
        price = models.FloatField()
        per_amount = models.CharField(max_length=100)
    
    class MealIngredient(models.Model):
        id = models.AutoField(primary_key=True)
        meal = models.ForeignKey(Meal, on_delete=models.CASCADE)
        ingredient = models.ForeignKey(Ingredient, on_delete=models.CASCADE)
    
    
    
    
    path = r"C:\Users\OSMAN MERT\Desktop\menu\menu_core\menu.json"
    
    def store_json_data(json_data):
        for meal_data in json_data:
            meal, created = Meal.objects.get_or_create(name=meal_data.get('name', ''))
            if not created:
                meal.is_vegetarian = meal_data.get('is_vegetarian', False)
                meal.is_vegan = meal_data.get('is_vegan', False)
                meal.save()
            for ingredient_data in meal_data.get('ingredients', []):
                ingredient, _ = Ingredient.objects.get_or_create(name=ingredient_data.get('name', ''), meal=meal)
                for option_data in ingredient_data.get('options', []):
                    option, _ = Option.objects.get_or_create(quality=option_data.get('quality', ''), ingredient=ingredient)
                    option.price = option_data.get('price', 0)
                    option.save()
    
    def load_json_file(path):
        with open(path) as json_file:
            json_data = json.load(json_file)
            store_json_data(json_data)
    
    load_json_file(path)

Это некоторые данные из menu.json, не весь код включен в него. menu.json

во-первых, ваш menu.json вы загружаете неправильный формат. Не хватает какого-то символа.

У вас правильный json, как вы загружаете в переменную json_data

Ошибка, которую вы показываете, означает, что meal_data вы получаете строку. И она не может использовать атрибут get.

Попробуйте обновить следующим образом для корректного получения каждого блюда в json. meal_data становится диктой и может использоваться get

    for meal_data in json_data.get("meals"):
        meal, created = Meal.objects.get_or_create(name=meal_data.get('name', ''))

Главное, что вы не правильно просматриваете словарь (Вы пытаетесь получить доступ к name атрибуту внутри key значения, которое является строкой). Вы можете либо:

def store_json_data(json_data):
    for key, meal_data in json_data.items():
        if key == 'meals':
            for meal in meal_data:
                print(meal.get('name', ''))

        if key == 'ingredients':
            for ingredient in meal_data:
                ...

Или, вместо цикла по словарю key:value pair, получить доступ к значению списка вручную, а затем выполнить цикл по нему:

def store_json_data(json_data):
    meals = json_data.get("meals")
    ingredients = json_data["ingredients"]

    for meal in meals:
        print(meal.get('name', ''))

    for ingredient in ingredients:
        ...

При этом то, что вы пытаетесь сделать, не будет работать, поскольку когда вы makemigrations в первый раз, таблицы базы данных еще не созданы и вызовут ошибку OperationalError.

Я бы предложил использовать сигнал post_migrate для заполнения таблиц.

Вернуться на верх