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 для заполнения таблиц.