我在Django中展示了一个典型的关系数据库模型,其中一个典型模型包含一些ForeignKeys
、一些ManyToManyFields
和一些扩展了Django的DateTimeField
的字段。
我想保存从外部api接收的JSON格式(而不是平面格式)的数据。我不希望数据被保存到各自的表中(而不是将整个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()
现在,我通常必须将从外部api (秘密忍者api)获得的json字符串数据保存到此模型中,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)
有很多我可以使用的方法,
view
函数中的
__init__
方法save()
方法我想知道是否有一种最明显的方法可以将数据以这种json形式保存到数据库中,而不需要多次编写上面的逻辑,您建议的最优雅的方法是什么?
感谢大家阅读这篇长篇文章。
https://stackoverflow.com/questions/8367609
复制相似问题