【发布时间】:2017-12-01 20:58:28
【问题描述】:
我正在尝试将一些初始数据从 JSON 文件导入 Django 中的数据库,但我终生无法弄清楚如何在自定义迁移中执行此操作。我的第一个函数返回与我的数据库中的模型Mineral 匹配的字段的字典。第二个函数的前两行取自关于自定义迁移的 Django 1.11 文档,其余的只是应该循环遍历 JSON 文件,使用第一个函数制作字典,然后 create() 他们,使用关键字参数来自字典。但是当我尝试运行它时,我得到django.db.transaction.TransactionManagementError: An error occurred in the current transaction. You can't execute queries until the end of the 'atomic' block.
现在我的自定义迁移文件如下所示:
from __future__ import unicode_literals
from django.db import migrations, IntegrityError
import json
def make_mineral_dict(mineral):
"""Make a dictionary out of a mineral object from JSON file"""
fields = {
'name': None,
'image filename': None,
'image caption': None,
'category': None,
'formula': None,
'strunz classification': None,
'crystal system': None,
'unit cell': None,
'color': None,
'crystal symmetry': None,
'cleavage': None,
'mohs scale hardness': None,
'luster': None,
'streak': None,
'diaphaneity': None,
'optical properties': None,
'refractive index': None,
'crystal habit': None,
'specific gravity': None,
'group': None,
}
for key, value in mineral.items():
fields[key] = value
return fields
def load_data(apps, schema_editor):
Mineral = apps.get_model("minerals", "Mineral")
db_alias = schema_editor.connection.alias
with open('minerals.json', encoding='utf-8') as file:
minerals = json.load(file)
for mineral in minerals:
try:
fields = make_mineral_dict(mineral)
Mineral.objects.using(db_alias).create(
name=fields['name'],
image_filename=fields['image filename'],
image_caption=fields['image caption'],
category=fields['category'],
formula=fields['formula'],
strunz_classification=fields['strunz classification'],
crystal_system=fields['crystal system'],
unit_cell=fields['unit cell'],
color=fields['color'],
crystal_symmetry=fields['crystal symmetry'],
cleavage=fields['cleavage'],
mohs_scale_hardness=fields['mohs scale hardness'],
luster=fields['luster'],
streak=fields['streak'],
diaphaneity=fields['diaphaneity'],
optical_properties=fields['optical properties'],
refractive_index=fields['refractive index'],
crystal_habit=fields['crystal habit'],
specific_gravity=fields['specific gravity'],
group=fields['group']
)
except IntegrityError:
continue
class Migration(migrations.Migration):
dependencies = [
('minerals', '0002_mineral_group'),
]
operations = [
migrations.RunPython(load_data),
]
非常感谢任何帮助。
注意:是的,我知道我可以使用**kwargs 删减大约 40 行代码,但不完全确定如何执行此操作(我还是新手);在这方面的任何建议也将不胜感激。
【问题讨论】: