Python 从JSON文件在Django中进行自定义迁移?
我试图将一些初始数据从JSON文件导入到Django中的数据库中,但我一辈子都不知道如何在自定义迁移中实现这一点。我的第一个函数返回字典,其中的字段与数据库中的模型Python 从JSON文件在Django中进行自定义迁移?,python,json,django,Python,Json,Django,我试图将一些初始数据从JSON文件导入到Django中的数据库中,但我一辈子都不知道如何在自定义迁移中实现这一点。我的第一个函数返回字典,其中的字段与数据库中的模型Mineral匹配。第二个函数的前两行取自Django 1.11文档中关于自定义迁移的部分,其余部分只是循环遍历JSON文件,使用第一个函数创建字典,然后使用字典中的关键字参数创建它们。但是当我尝试运行它时,我得到了django.db.transaction.TransactionManagementError:当前事务中发生了一个错
Mineral
匹配。第二个函数的前两行取自Django 1.11文档中关于自定义迁移的部分,其余部分只是循环遍历JSON文件,使用第一个函数创建字典,然后使用字典中的关键字参数创建它们。但是当我尝试运行它时,我得到了django.db.transaction.TransactionManagementError:当前事务中发生了一个错误。在“原子”块结束之前,您无法执行查询。
现在,我的自定义迁移文件如下所示:
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行代码,但不知道该怎么做(我还是个新手);关于这方面的任何建议都将不胜感激。根据我的理解,Django的交易是由“原子部分”组成的,我认为这是相当有限的。基本上,整个事务可以分为该事务的所有步骤。如果1在过程中失败,您可以回滚这些步骤
默认情况下,Sqlite和Postgres使用事务。Django迁移默认为atomic=True
有几种方法可以解决这个问题
atomic=False
这将有效地运行迁移,而不需要事务
- 如图所示
中包装“事务尝试”
@transaction.atomic
从django.db导入事务
#在顶部导入。。。
def load_数据(应用程序、架构编辑器):
矿物=应用程序。获取_模型(“矿物”、“矿物”)
db_alias=schema_editor.connection.alias
以open('minerals.json',encoding='utf-8')作为文件:
minerals=json.load(文件)
对于矿物中的矿物:
尝试:
字段=制作矿物目录(矿物)
#把这条线绕着。。。
使用transaction.atomic():
Mineral.objects.using(db_别名)。创建(
名称=字段['name'],
image_filename=字段['image filename'],
image_caption=字段['image caption'],
类别=字段['category'],
公式=字段[“公式”],
strunz_classification=字段['strunz classification'],
crystal_system=字段['crystal system'],
unit_cell=字段['unit cell'],
颜色=字段['color'],
晶体对称=场[‘晶体对称’],
劈开=字段[“劈开”],
莫氏硬度=字段[‘莫氏硬度’],
luster=字段['luster'],
条纹=字段[“条纹”],
透明度=字段[“透明度”],
光学性质=字段[“光学性质”],
折射率=场[‘折射率’],
水晶习惯=字段['crystal Habity'],
比重=场[‘比重’],
组=字段['group']
)
除完整性错误外:
持续
根据我的理解,Django中的事务是由“原子部分”组成的,我认为这是相当有限的。基本上,整个事务可以分为该事务的所有步骤。如果1在过程中失败,您可以回滚这些步骤
默认情况下,Sqlite和Postgres使用事务。Django迁移默认为atomic=True
有几种方法可以解决这个问题
atomic=False
这将有效地运行迁移,而不需要事务
- 如图所示
中包装“事务尝试”
@transaction.atomic
从django.db导入事务
#在顶部导入。。。
def load_数据(应用程序、架构编辑器):
矿物=应用程序。获取_模型(“矿物”、“矿物”)
db_alias=schema_editor.connection.alias
以open('minerals.json',encoding='utf-8')作为文件:
minerals=json.load(文件)
对于矿物中的矿物:
尝试:
字段=制作矿物目录(矿物)
#