Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从JSON文件在Django中进行自定义迁移?_Python_Json_Django - Fatal编程技术网

Python 从JSON文件在Django中进行自定义迁移?

Python 从JSON文件在Django中进行自定义迁移?,python,json,django,Python,Json,Django,我试图将一些初始数据从JSON文件导入到Django中的数据库中,但我一辈子都不知道如何在自定义迁移中实现这一点。我的第一个函数返回字典,其中的字段与数据库中的模型Mineral匹配。第二个函数的前两行取自Django 1.11文档中关于自定义迁移的部分,其余部分只是循环遍历JSON文件,使用第一个函数创建字典,然后使用字典中的关键字参数创建它们。但是当我尝试运行它时,我得到了django.db.transaction.TransactionManagementError:当前事务中发生了一个错

我试图将一些初始数据从JSON文件导入到Django中的数据库中,但我一辈子都不知道如何在自定义迁移中实现这一点。我的第一个函数返回字典,其中的字段与数据库中的模型
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()在上下文管理器
    中包装“事务尝试”

  • 使用“事务尝试”创建函数,并将该函数包装到装饰器
    @transaction.atomic

  • 如图2和3所示

    我倾向于使用上下文管理器解决方案,并使事务保持得体。因为对于不使用事务的数据库,文档会说:

    原子属性对不支持DDL事务的数据库(例如MySQL、Oracle)没有影响

    因此,对于您的代码示例,我将输入import for transaction<代码>从django.db导入事务

    从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()在上下文管理器
    中包装“事务尝试”

  • 使用“事务尝试”创建函数,并将该函数包装到装饰器
    @transaction.atomic

  • 如图2和3所示

    我倾向于使用上下文管理器解决方案,并使事务保持得体。因为对于不使用事务的数据库,文档会说:

    原子属性对不支持DDL事务的数据库(例如MySQL、Oracle)没有影响

    因此,对于您的代码示例,我将输入import for transaction<代码>从django.db导入事务

    从django.db导入事务
    #在顶部导入。。。
    def load_数据(应用程序、架构编辑器):
    矿物=应用程序。获取_模型(“矿物”、“矿物”)
    db_alias=schema_editor.connection.alias
    以open('minerals.json',encoding='utf-8')作为文件:
    minerals=json.load(文件)
    对于矿物中的矿物:
    尝试:
    字段=制作矿物目录(矿物)
    #