Самый элегантный подход для записи данных JSON в реляционную базу данных с использованием моделей Django?

У меня есть типичная модель реляционной базы данных, изложенная в Django, где типичная модель содержит некоторые ForeignKeys , некоторые ManyToManyFields и некоторые поля, расширяющие DateTimeField .

Я хочу сохранить данные, которые я получаю, в формате JSON (не в плоском формате) из внешнего API. Я не хочу, чтобы данные сохранялись в соответствующие таблицы (а не вся строка json в одно поле).Какой самый простой и понятный подход для этого? Есть ли библиотека для упрощения этой задачи?

Вот пример, поясняющий мой вопрос:

Модели-

class NinjaData(models.Model):
    id = models.IntegerField(primary_key=True, unique=True)
    name = models.CharField(max_length=60)  
    birthdatetime = MyDateTimeField(null=True)
    deathdatetime = MyDatetimeField(null=True)
    skills = models.ManyToManyField(Skills, null=True)
    weapons = models.ManyToManyField(Weapons, null=True)
    master = models.ForeignKey(Master, null=True)

class Skills(models.Model):
    id = models.IntegerField(primary_key=True, unique=True)
    name = models.CharField(max_length=60)
    difficulty = models.IntegerField(null=True)

class Weapons(models.Model):
    id = models.IntegerField(primary_key=True, unique=True)
    name = models.CharField(max_length=60)
    weight = models.FloatField(null=True)

class Master(models.Model):
    id = models.IntegerField(primary_key=True, unique=True)
    name = models.CharField(max_length=60)
    is_awesome = models.NullBooleanField()

сейчас мне обычно приходится сохранять строковые данные json, которые я получаю из внешнего API (secret ninja api) в эту модель, json выглядит так

JSON-

{
"id":"1234",
"name":"Hitori",
"birthdatetime":"11/05/1999 20:30:00",
"skills":[
    {
    "id":"3456",
    "name":"stealth",
    "difficulty":"2"
    },
    {
    "id":"678",
    "name":"karate",
    "difficulty":"1"
    }
],
"weapons":[
    {
    "id":"878",
    "name":"shuriken",
    "weight":"0.2"
    },
    {
    "id":"574",
    "name":"katana",
    "weight":"0.5"
    }
],
"master":{
    "id":"4",
    "name":"Schi fu",
    "is_awesome":"true"
    }
}

теперь логика для обработки типичного ManyToManyField довольно проста,

логический код -

data = json.loads(ninja_json)
ninja = NinjaData.objects.create(id=data['id'], name=data['name'])

if 'weapons' in data:
    weapons = data['weapons']
    for weapon in weapons:
        w = Weapons.objects.get_or_create(**weapon)  # create a new weapon in Weapon table
        ninja.weapons.add(w)

if 'skills' in data:
    ...
    (skipping rest of the code for brevity)

Есть много подходов, которые я мог бы использовать,

  • код выше логики в функции представления , которая выполняет всю работу по преобразованию json в экземпляры модели
  • код выше логики, переопределяющий модель __ init __ метод
  • код выше логика переопределяя модель save () метод
  • создает диспетчер для каждой модели и кодирует эту логику внутри каждого из его методов, например create , get_or_create , filter и т. д.
  • расширить ManyToManyField и поместить его туда,
  • внешнюю библиотеку?

Я хотел бы знать, есть ли подпись Самый очевидный способ сохранить данные в этой json-форме в базе данных без многократного кодирования вышеуказанной логики, какой будет наиболее элегантный подход, который вы могли бы предложить?

Спасибо всем за то, что прочитали длинный пост,

17
задан Optimus 4 December 2011 в 14:49
поделиться