【问题标题】:Django import/reformat JSON into ModelDjango 将 JSON 导入/重新格式化为模型
【发布时间】:2017-09-14 11:22:12
【问题描述】:

我喜欢定期将 json 数据导入 Django。将以下数据导入 Django 模型的最佳方法是什么。

据我所知,使用Django fixtures 是最好的方法。由于我的模型看起来像这样,并且我无法更改给定的 JSON,因此导入数据或重组 JSON 以将其用作固定装置的最佳方法是什么。


Django 模型

class Item(models.Model):
    item_name = models.CharField(max_length=250)
    timestamp = models.DateTimeField()
    value01 = models.DecimalField(max_digits=7, decimal_places=2)
    value02 = models.DecimalField(max_digits=7, decimal_places=2)

我喜欢存储的数据:

Item1  |  2017-04-18 09:24:46  |  15.00 | 12.68
Item1  |  2017-04-18 09:25:44  |  14.92 | 12.42

给定 JSON:

[
  {
    "id": 1,
    "timestamp": "2017-04-18 09:24:46",
    "details": {
      "id": 843,
      "color": "white"
    },
    "item": {
      "id": 1691,
      "category": "1",
      "item_type": {
        "id": 14,
        "name": "Item1"
      }
    },
    "itemdatavalues": [
      {
        "id": 227,
        "value": "15.00"
      },
      {
        "id": 228,
        "value": "12.68"
      }
    ]
  },
  {
    "id": 2,
    "timestamp": "2017-04-18 09:25:44",
    "details": {
      "id": 843,
      "color": "white"
    },
    "item": {
      "id": 161,
      "category": "1",
      "item_type": {
        "id": 14,
        "name": "Item1"
      }
    },
    "itemdatavalues": [
      {
        "id": 283,
        "value": "14.92"
      },
      {
        "id": 284,
        "value": "12.42"
      }
    ]
  }
]

【问题讨论】:

    标签: python json django


    【解决方案1】:

    我写了一个简单的脚本来解析输入文件并生成一个fixture:

    import json
    import copy
    
    with open('/tmp/data.json') as dataf, open('/tmp/output.json', 'w') as out:
        data = json.load(dataf)
        newdata = []
        for i, block in enumerate(data):
            new = dict(model="appname.Item", pk=block['id'])
            new['fields'] = dict(item_name=block['item']['item_type']['name'],
                                 timestamp=block['timestamp'],
                                 value01=block['itemdatavalues'][0]['value'],
                                 value02=block['itemdatavalues'][1]['value'])
            newdata.append(copy.deepcopy(new))
        json.dump(newdata, out, indent=2)
    

    使用您的输入,结果是:

    [
      {
        "pk": 1,
        "model": "appname.Item",
        "fields": {
          "item_name": "Item1",
          "timestamp": "2017-04-18 09:24:46",
          "value01": "15.00",
          "value02": "12.68"
        }
      },
      {
        "pk": 2,
        "model": "appname.Item",
        "fields": {
          "item_name": "Item1",
          "timestamp": "2017-04-18 09:25:44",
          "value01": "14.92",
          "value02": "12.42"
        }
      }
    ]
    

    适合用作固定装置。显然,您必须修复appname

    【讨论】:

      【解决方案2】:

      这可能会有所帮助:https://docs.djangoproject.com/en/1.11/ref/models/instances/。您应该能够在接收该 json 的任何方法中创建一个新模型对象,然后将您想要的任何 json 值解析到对象中。 python有一些非常简单的json库。也就是说,除非您想以不同的方式处理某些事情,或者我阅读的文档有误。祝你有美好的一天!

      【讨论】:

        猜你喜欢
        • 2012-03-27
        • 2014-07-24
        • 1970-01-01
        • 1970-01-01
        • 2019-08-05
        • 1970-01-01
        • 1970-01-01
        • 2016-06-27
        • 2014-04-14
        相关资源
        最近更新 更多