Django将JSON导入/重新格式化为模型

时间:2017-04-18 14:40:13

标签: python json django

我喜欢定期将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"
      }
    ]
  }
]

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

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