目录

    1. Fixtures 特点

    Fixtures 是一种新的提供初始化数据的方法,并且被 Django 的测试框架用来处理单元测试的测试数据。不同于 SQL 文件的是,使用 fixture 可以提供一个被 Django 的 serialization 系统所能识别的序列化文件,它会被读取并自动转换成对应的 model ,然后保存进数据库。

    2. 数据导出

    将 app_name 的数据导出为 initial_data.json。

    python manage.py    dumpdata app_name > initial_data.json
    

    3. 数据导入

    导入方式有两种,一种是执行 loaddata 命令,另外一种是通过 migrations 文件,变更数据库时,插入数据。

    3.1 loaddata 导入数据

    将数据储存在应用的 fixtures 目录中,然后执行导入命令:

    python manage.py    loaddata  app_name/fixtures/initial_data.json
    > Installed 1 object(s) from 1 fixture(s)
    

    由于,在 initial_data.json 已经指明了 model ,这里不需要其他参数就能按照预期导入数据。需要注意的是,由于 dumpdata 导出的文件中有 pk ,如果数据库中已经存在该 pk,数据不会被再次导入。

    3.2 Python Migration 导入数据

    在 Django 的 settings.py 文件中,新增

    import os
    PROJECT_ROOT = os.path.dirname(os.path.abspath(__file__))
    PROJECT_DIR, PROJECT_MODULE_NAME = os.path.split(PROJECT_ROOT)
    FIXTURE_FILE = os.path.join(PROJECT_DIR, PROJECT_MODULE_NAME, 'app_name/fixtures/initial_data.json')
    

    指明初始化数据的文件目录。

    使用 python manage.py makemigrations --empty app_name 命令,在 app_name 的 migrations 目录下创建一个空的 Python 文件。内容如下:

    # -*- coding: utf-8 -*-
    from __future__ import unicode_literals
    
    import json
    from django.db import migrations
    from settings import FIXTURE_FILE
    from app_name.models import AppModel
    
    
    def forwards_func(apps, schema_editor):
        try:
            json_data = open(FIXTURE_FILE)
            _obj = json.load(json_data)
            _obj = [i['fields'] for i in user_obj]
            _list = [AppModel(username=i['username'], last_name=i['last_name'], password=i['password']
                                  ) for i in _obj]
            if _list:
                AppModel.objects.bulk_create(_list)
            json_data.close()
        except:
            pass
    
    
    class Migration(migrations.Migration):
    
        dependencies = [
            ('app_name', '0001_initial'),
        ]
    
        operations = [
            migrations.RunPython(forwards_func),
        ]
    

    然后执行

    python manage.py migrate app_name
    

    Django Migration 提供了两个函数,用于数据的操作

    • forwards_func 用来执行插入数据的操作。
    • reverse_func 用来执行回滚操作。

    需要注意的是,这里是通过 open 一个 json 文件来获取初始化数据,还可以通过硬编码写入 Python 文件、读取 Excel、读取 TXT 等方式获取初始化数据。

    4. 适用场景

    Fixtures 适用于少量的初始化数据,因为它使用 Django 的序列化功能,所以不依赖于特定的数据库。它执行起来没有SQL快,因为要创建对象。另外,这个功能可以在你切换数据库平台的时候使用,比如我要把系统从 Mysql 切换到 PostgreSQL ,就可以使用 fixtures 来导入转出数据。