django中如何加载初始数据?


定义了一个django model,想制作一个初始数据文件,可以让用户直接加载进去,如何操作呢?

编程 django 初始数据 加载

eeess 10 years, 8 months ago

常用的有两种方式,一种是通过 fixtures,一种是直接 定义 sql的初始值。

1. 使用fixtures

一个fixture就是一个数据集合,django知道如何把这个数据集合导入到相关数据库里面。 不同于SQL文件的是,使用fixture你可以提供一个被Django的serialization系统所能识别的序列化文件,它会被读取并自动转换成对应的model,然后保存进你的数据库。

你需要创建一个fixture文件(使用manage.py的dumpdata命令更简单),确保文件名为initial_data,后缀名可以是json, xml, yaml, python其一。

把这个文件放到你的app目录下的fixtures目录里,它就会在执行syncdb的时候创建完你的数据表后自动读取并插入数据。

如果你有更多fixture文件 或者syncdb的时候没有提供fixture的话,你也可以使用 manage.py 的 loaddata 命令手工加载fixture。

这个数据集合是什么样的呢?举个JSON的例子:

[
  {
    "model": "myapp.person",
    "pk": 1,
    "fields": {
      "firstname": "John",
      "lastname": "Lennon"
    }
  },
  {
    "model": "myapp.person",
    "pk": 2,
    "fields": {
      "firstname": "Paul",
      "lastname": "McCartney"
    }
  }
]

然后,可以通过以下命令把数据导入

manage.py loaddata fixturename

2. 直接使用sql

你只需要提供一个SQL文件,包含标准的Insert语句,Django会在创建了数据表以后执行你的SQL文件。

要使用该方式,你需要在你的app目录下增加一个"sql"目录,对应你的每个model所需要的初始化数据,提供一个"model名.sql"的文件,model名是跟你定义的model相同的名字(这里使用小写,也就是get_model()方法返回的名字或者在model的meta信息中定义的model名字)。比如,我有一个名为blog的application,其中包含一个Entry的model,那我就可以在blog里面的sql目录下放一个entry.sql文件,里面写insert语句就可以了。

在这个文件里你也可以放其它的SQL语句,不仅仅是INSERT,但是需要提醒你,同一个app的多个SQL初始化文件,其执行顺序是不一定的,而且也不是所有的SQL语法都支持。为了处理不同的数据库类型的SQL兼容性,Django会对该文件进行处理,而不是直接去执行它。

你可以使用manage.py的sqlcustom命令查看一个app是否提供了初始化SQL

灼眼D逢坂大河 answered 10 years, 8 months ago

Your Answer