首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用Django模型将JSON数据写入关系数据库最优雅的方法是什么?

使用Django模型将JSON数据写入关系数据库最优雅的方法是什么?
EN

Stack Overflow用户
提问于 2011-12-03 20:23:07
回答 3查看 18.3K关注 0票数 17

我在Django中展示了一个典型的关系数据库模型,其中一个典型模型包含一些ForeignKeys、一些ManyToManyFields和一些扩展了Django的DateTimeField的字段。

我想保存从外部api接收的JSON格式(而不是平面格式)的数据。我不希望数据被保存到各自的表中(而不是将整个json字符串保存到一个字段中)。做这件事最干净、最简单的方法是什么?有没有库可以让这项任务变得更简单?

这里有一个例子来澄清我的问题,

型号-

代码语言:javascript
复制
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()

现在,我通常必须将从外部api (秘密忍者api)获得的json字符串数据保存到此模型中,json如下所示

JSON-

代码语言:javascript
复制
{
"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的逻辑相当简单,

逻辑代码-

代码语言:javascript
复制
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)

有很多我可以使用的方法,

view函数中的

  • 代码上面的逻辑完成将json转换为模型instances
  • code上面的逻辑覆盖模型的__init__方法
  • 代码上面的逻辑覆盖模型的save()方法
  • 为每个模型创建一个管理器,并在其每个方法内编码此逻辑,如<代码>D23、<代码>D24、<代码>D25等。H226<代码>H127扩展D28并放在那里,<代码>H229<代码>H130外部库?<代码>H231<代码>F232

我想知道是否有一种最明显的方法可以将数据以这种json形式保存到数据库中,而不需要多次编写上面的逻辑,您建议的最优雅的方法是什么?

感谢大家阅读这篇长篇文章。

EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8367609

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档