Please enable Javascript to view the contents

Django 初始化数据之 fixture

 ·  ☕ 2 分钟

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 来导入转出数据。


微信公众号
作者
微信公众号