Answers
常用的有两种方式,一种是通过 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