Django:将来自外部 API 的数据映射到模型中?

Posted

技术标签:

【中文标题】Django:将来自外部 API 的数据映射到模型中?【英文标题】:Django: Map data from an external APIs into a model? 【发布时间】:2013-11-29 22:48:21 【问题描述】:

我正在从各种外部 API 中提取一些 JSON 数据。他们的数据可能是这样的结构:

"game": 
    "title": "Super Mario Bros. 3",
    "release": "1989",
    "players": 3,
    ..

但是,我想通过这个模型将它直接存储在我的数据库中:

class Game(models.Model):
    name = models.CharField()
    debut = models.DateField()
    max_players = models.IntegerField()

如您所知,JSON 属性与模型的属性不匹配。

是否有一种简洁的方法来映射每个属性以轻松导入这些数据?是否可以通过 django 的反序列化模块做到这一点?还是我需要自己创造一些东西?

【问题讨论】:

【参考方案1】:

您可以创建类方法(或将其放在模型管理器https://docs.djangoproject.com/en/dev/ref/models/instances/#creating-objects):

class Game(models.Model):
    name = models.CharField()
    debut = models.DateField()
    max_players = models.IntegerField()

    @classmethod
    def create_from_j(cls, game): # assumed that game is dict already
        j2m = 'title': 'name', 'release': 'debut', 'players': 'max_players'
        return cls(**j2m[k]:v for k,v in game.items())

只需调用此方法,然后您需要从 json 数据创建一个游戏:

game = Game.create_from_j(json.loads(json_game))

【讨论】:

这是一个很好的开始,感谢您的提示!顺便说一句,将其转移到模型管理器中是否有好处? 我觉得没那么重要。仅当我已经为该模型提供了一个功能时,我才会在自定义管理器中移动此功能【参考方案2】:

我认为最简单的方法是使用 python 编写脚本。 你可能需要 json 模块来处理你得到的数据,转换成 python 对象。

然后,循环json,使用Game.objects.create()向数据库插入数据

【讨论】:

我想过这样做,但我有 20 多个外部资源(并且还在增长)。尽量减少体力劳动并尽可能保持代码干燥。 @simonwjackson ,我比较了一些处理这些问题的方法,脚本是最简单的方法。ps,这个功能,只是为你的应用程序提供数据,所以保持应用程序干净,隔离代码不相关.

以上是关于Django:将来自外部 API 的数据映射到模型中?的主要内容,如果未能解决你的问题,请参考以下文章

Django:项目使用来自 REST API 的数据,如何在这个系统中使用外部应用程序?

Django模型和ORM

即使模型正确,来自 API 的响应也不会映射到对象

Django:如何根据来自行的数据和来自另一个模型的数据将聚合字段添加到查询集中?

来自核心数据和外部源的模型对象

KnockoutJS 映射不