首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django:要映射外部API响应并将其存储到具有多个关系的复杂模型中

Django:要映射外部API响应并将其存储到具有多个关系的复杂模型中
EN

Stack Overflow用户
提问于 2020-08-30 18:09:35
回答 1查看 412关注 0票数 1

我有一个Django应用程序,在这个应用程序中,系统单击按钮就会调用API。API以一个复杂的结构返回数据,该结构由带有进一步嵌套的jsons的项列表组成:

代码语言:javascript
复制
[ 
  {
    "_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
}]

我有一个模型,它包含了许多与另一个模型的关系,比如:

代码语言:javascript
复制
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()。

是否有一个特定的示例或教程帮助我们创建一种中间件类型的层,以方便地映射响应?我探索了序列化程序,但没有找到一个好的方法来保存。

注意:由于对许多人来说,我不能直接迭代和保存包,因为这样会引发错误。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-30 19:28:12

将源代码转换为下面的源代码。在这里,我创建了一个名为staticmethodmap_and_save,它将支持您根据给定的JSON数据格式映射和保存数据。您可以从您的view类调用此方法。

代码语言:javascript
复制
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="+")
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63660596

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档