Python Django:要映射并存储到具有许多关系的复杂模型中的外部API响应
我有一个Django应用程序,在这个应用程序中,系统单击一个按钮就调用一个API。API以一个复杂的结构返回数据,该结构由一系列具有更多嵌套JSON的项组成:Python Django:要映射并存储到具有许多关系的复杂模型中的外部API响应,python,django,django-models,Python,Django,Django Models,我有一个Django应用程序,在这个应用程序中,系统单击一个按钮就调用一个API。API以一个复杂的结构返回数据,该结构由一系列具有更多嵌套JSON的项组成: [ { "_id": "76070ba8-e9f8-11ea-a1ac-42010a800002", "courses": [ { "_id": "-machine-learning-solutio
[
{
"_id": "76070ba8-e9f8-11ea-a1ac-42010a800002",
"courses": [
{
"_id": "-machine-learning-solutions",
"title": " Machine Learning Solutions",
"tags": [
"MAChine learning",
]
},
{
"_id": "natural-language-processing",
"title": "Natural Language Processing ",
"tags": [
"Natural Language"
]
}
],
"description": "MAchine Learning
"popularity": "This Program is not rated yet"
},
{
similar structure
}]
我有一个模型,它包含许多与另一个模型的关系,如:
class Bundle:
name = models.charField(max_length=100)
items = models.ManytoManyField(Item)
popularity = models.CharField(max_length=100)
class Item:
name = models.charField(max_length=100)
provider = models.ForeignKey(provider,null=True,
blank=False,
on_delete=models.CASCADE,
related_name="+")
将json转换后的响应(我使用json.dumps将其转换为json进行渲染)映射到模型的最佳方式是什么,这样我就可以在屏幕上单击调用视图并执行modelObj.save()或create()
是否有一个具体的示例或教程可以帮助我们创建一个中间件类型的层,以便轻松映射响应?我研究了serialiser,但没有找到一个好的保存方法
注意:由于多对多的原因,我无法直接迭代和保存捆绑包,因为这会引发错误。将您的源代码转换为以下代码。在这里,我创建了一个名为
map\u和
的staticmethod
,它将支持您根据给定的JSON
数据格式映射和保存数据。您可以从视图
类调用此方法
from django.db import models
class Bundle(models.Model):
name = models.charField(max_length=100)
items = models.ManytoManyField(Item)
popularity = models.CharField(max_length=100)
def map_and_save(data=None):
if data is None:
return
if isinstance(data, list):
mapper = {"courses": ["items"], "description": "name", "popularity": "popularity"}
for datum in data:
bundle_data = {}
item_instances = []
for key, val in datum.items():
field_name = mapper.get(key, None)
if field_name is None:
continue
elif isinstance(field_name, list):
for _val in val:
item = Item.objects.create(name=_val.get("title"))
item_instances.append(item)
continue
bundle_data[field_name] = val
bundle = Bundle.objects.create(**bundle_data)
bundle.items.add(*item_instances)
class Item(models.Model):
name = models.charField(max_length=100)
provider = models.ForeignKey(provider,null=True, blank=False,on_delete=models.CASCADE, related_name="+")
将源代码转换为以下代码。在这里,我创建了一个名为
map\u和
的staticmethod
,它将支持您根据给定的JSON
数据格式映射和保存数据。您可以从视图
类调用此方法
from django.db import models
class Bundle(models.Model):
name = models.charField(max_length=100)
items = models.ManytoManyField(Item)
popularity = models.CharField(max_length=100)
def map_and_save(data=None):
if data is None:
return
if isinstance(data, list):
mapper = {"courses": ["items"], "description": "name", "popularity": "popularity"}
for datum in data:
bundle_data = {}
item_instances = []
for key, val in datum.items():
field_name = mapper.get(key, None)
if field_name is None:
continue
elif isinstance(field_name, list):
for _val in val:
item = Item.objects.create(name=_val.get("title"))
item_instances.append(item)
continue
bundle_data[field_name] = val
bundle = Bundle.objects.create(**bundle_data)
bundle.items.add(*item_instances)
class Item(models.Model):
name = models.charField(max_length=100)
provider = models.ForeignKey(provider,null=True, blank=False,on_delete=models.CASCADE, related_name="+")
两个问题:1。为什么选择“课程”:[“项目”]?为课程创建另一个映射器json会更好吗?2.从API应用程序本身调用它是否是一种好的做法,因为bundle是另一个应用程序,courses也是。还是应该在定义模型的bundle类中?@sudipgupta,1。它作为一个映射器,可以很容易地识别
多对多
字段以进行映射,因为我已经将其作为列表实例
。2.如果您在应用程序中的任何位置调用它都没有问题,但是在调用之前请正确导入模型。它不必在捆绑包中
类中。如果有人能在这里回答,就会遇到问题:我使用json.loads将json转换为对象,并发送到UI进行渲染。json实际上是如上所示的列表。在使用hidden param=列表的当前项发布表单时,该对象被发布回视图,并且应该按照Sayem的指导创建模型。但是,表单数据现在有单引号的对象,不能像json.dumps一样再次转储到json中。建议的方法是什么?要对数据进行jsonify,请使用以下代码data=json.dumps(json.loads(str(data).replace(“'”,“““”))
已经尝试过了。谢谢你的观点。但是它对数据进行了编码。现在,我们将根据你的代码保存和构建一个列表,并考虑以后保存每个响应的性能。你是救世主伴侣!!几个问题:1.为什么“课程”:[“项目”]?最好也为课程创建另一个映射器json?2.从API应用程序本身调用它是一种好做法,因为bundle是另一个应用程序,课程也是如此。还是应该在定义模型的bundle类中?@sudipgupta,1.它作为映射器,可以轻松识别多对多
字段以进行映射,因为我我已经将它指出为一个列表实例
.2。如果你从应用程序中的任何地方调用它,都没有问题,但是在调用之前,正确导入
模型。它不必位于包
类中。如果有人能在这里回答,我就遇到了一个问题:我使用json.loads将json转换为对象,并发送到UI进行渲染ing.json实际上是一个列表,如上图所示。在发布一个带有hidden param=列表当前项的表单时,该对象被发布回视图,并按照Sayem的指导创建模型。但是,表单数据现在有带单引号的对象,不能像json.dumps一样再次转储到json中。建议的方法是什么?到j使用以下代码对数据进行声音处理。data=json.dumps(json.loads(str(data.replace(“,”)))
已经尝试过了。谢谢你的意见。但它对数据进行了编码。现在,我们将根据您的代码保存并构建一个列表,并考虑以后保存每个响应的性能。你是救世主的伴侣!!