1. Fixtures 特点
Fixtures 是一种新的提供初始化数据的方法,并且被 Django 的测试框架用来处理单元测试的测试数据。不同于 SQL 文件的是,使用 fixture 可以提供一个被 Django 的 serialization 系统所能识别的序列化文件,它会被读取并自动转换成对应的 model ,然后保存进数据库。
2. 数据导出
将 app_name 的数据导出为 initial_data.json。
1
| python manage.py dumpdata app_name > initial_data.json
|
3. 数据导入
导入方式有两种,一种是执行 loaddata 命令,另外一种是通过 migrations 文件,变更数据库时,插入数据。
3.1 loaddata 导入数据
将数据储存在应用的 fixtures 目录中,然后执行导入命令:
1
2
| 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 文件中,新增
1
2
3
4
| 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 文件。内容如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
| # -*- 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),
]
|
然后执行
1
| python manage.py migrate app_name
|
Django Migration 提供了两个函数,用于数据的操作
- forwards_func 用来执行插入数据的操作。
- reverse_func 用来执行回滚操作。
需要注意的是,这里是通过 open 一个 json 文件来获取初始化数据,还可以通过硬编码写入 Python 文件、读取 Excel、读取 TXT 等方式获取初始化数据。
4. 适用场景
Fixtures 适用于少量的初始化数据,因为它使用 Django 的序列化功能,所以不依赖于特定的数据库。它执行起来没有SQL快,因为要创建对象。另外,这个功能可以在你切换数据库平台的时候使用,比如我要把系统从 Mysql 切换到 PostgreSQL ,就可以使用 fixtures 来导入转出数据。