我有一个Django应用程序,在这个应用程序中,系统单击按钮就会调用API。API以一个复杂的结构返回数据,该结构由带有进一步嵌套的jsons的项列表组成:
[
{
"_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()。
是否有一个特定的示例或教程帮助我们创建一种中间件类型的层,以方便地映射响应?我探索了序列化程序,但没有找到一个好的方法来保存。
注意:由于对许多人来说,我不能直接迭代和保存包,因为这样会引发错误。
发布于 2020-08-30 19:28:12
将源代码转换为下面的源代码。在这里,我创建了一个名为staticmethod的map_and_save,它将支持您根据给定的JSON数据格式映射和保存数据。您可以从您的view类调用此方法。
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="+")https://stackoverflow.com/questions/63660596
复制相似问题