【发布时间】:2012-01-12 03:33:34
【问题描述】:
我在 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函数中的上述逻辑代码完成将 json 转换为模型实例的所有工作 - 上面的代码覆盖模型的
__init__方法的逻辑 - 上面的代码覆盖模型的
save()方法的逻辑 - 为每个模型创建一个管理器,并在其每个方法中编码此逻辑,例如
create、get_or_create、filter等。 - 扩展
ManyToManyField并将其放在那里, - 外部库?
我想知道是否有一种最明显的方法可以将此 json 形式的数据保存到数据库而无需多次编码上述逻辑,您会采用哪种最优雅的方法建议?
感谢大家阅读这篇长文,
【问题讨论】:
-
感谢详细的解释,我会关注这个帖子的。开个玩笑(抱歉):您可以使用 MS 数据适配器执行此操作:da = New OleDb.OleDbDataAdapter(sql, con) , da.update(ninja_json)。 ;)
-
顺便说一句,您的模型上不需要
id = models.IntegerField(primary_key=True, unique=True),Django 已经自动创建了该字段。在创建新实例docs.djangoproject.com/en/dev/ref/models/instances/… 时仍然可以提供乱序的 id 值 -
是的,我已经知道我不需要添加 id 自动字段,django 为我做了。但是,正如我之前所说,我正在保存从外部 api 获得的数据,该 api 已经包含一个唯一的 Id 字段,稍后我使用该 api 时将需要它。
-
在当今(2017)JSON 是存储格式:见PostgreSQL 9.6+和成熟的JSONb数据类型....如果spring-boot有好的驱动,Django也可以使用好司机。
标签: python django json django-models relational-database