我喜欢定期将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"
}
]
}
]
答案 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库。也就是说,除非你想要以不同的方式处理某些事情,否则我正在阅读错误的文档。祝你有个美好的一天!