当你第一次配置一个app的时候,有时候使用硬编码的数据去预填充你的数据库是非常有用的。这里有几个你可以让django自动创建这些数据的方法:你可以提供固定格式的初始化数据或者提供通过SQL初始化数据。

一般情况下,使用固定格式的初始化数据比使用SQL初始化更干净(因为是数据库无关的),但是没有使用SQL方便

用固定格式提供初始化数据

固定格式一个django知道怎么导进数据库的数据的集合。最直接的方法去知道固定格式是通过manage.py dumpdata去导出一些数据。或者你可以手写固定格式,xml,yaml和json。21:序列化django对象有关于这些序列化格式的具体说明。下面是一个例子,看起来有点像json吧

[
{
"model": "myapp.person",
"pk": ,
"fields": {
"first_name": "John",
"last_name": "Lennon"
}
},
{
"model": "myapp.person",
"pk": ,
"fields": {
"first_name": "Paul",
"last_name": "McCartney"
}
}
]

这是像yaml的固定格式

- model: myapp.person
pk:
fields:
first_name: John
last_name: Lennon
- model: myapp.person
pk:
fields:
first_name: Paul
last_name: McCartney

你可以在你的app里面存储这些数据在一个fixtures目录。

加载数据是很容易的:只需调用manage.py loaddata,<fixturename>是你已经创建的固定格式的名字。每次你运行loaddata的时候,从固定格式读取的数据会被重新加载进数据库。注意这意味着如果你改变你创建的固定格式中的任意一行,然后运行loaddata,你将丢失你做出的任何改变。

通过数据的固定格式自动加载

如果你创建一个名叫initial_data.[xml/yaml/json]的固定格式,那么每次你运行syncdb的时候这个固定格式都会被加载。这是极其方便的,但注意的是,每次运行syncdb数据都会被刷新。所以不要使用initial_data作为你想编辑的数据的文件名。

django从哪里寻找固定格式文件

默认,django会在每个app里面寻找fixtures目录。你可以设置FIXTURES_DIRS的值,这是一个额外的django应该寻找的目录的列表

当你运行manage.py loaddata,你也可以给定一个具体的绝对目录到你的固定格式文件,这会覆盖搜索的一般目录

提供初始化的SQL数据

django提供了传递数据库任意的SQL的钩子,这些SQL是当你运行syncdb的时候在CREATE TABLE后会被运行的。你可以使用这个钩子去填充默认记录,或者创建SQL函数或者视图函数,触发器等等。

钩子是很简单的:django会在你的app目录下寻找一个名叫sql/<modelname>.sql的文件,这个文件的中的modelname是你的模型名字的小写。

所以,如果你有一个名叫Person的模型在你的名为myapp的app目录下,你可以在你的myapp目录下的sql/person.sql文件里面添加任意的SQL,下面是一个例子:

INSERT INTO myapp_person (first_name, last_name) VALUES ('John', 'Lennon');
INSERT INTO myapp_person (first_name, last_name) VALUES ('Paul', 'McCartney');

每个sql文件(如果有的话),应该包含有效的往表中插入数据的语句(分号隔开的insert语句)。sql文件可以被manage.py中的sqlcustom,sqlreset,sqlall和reset命令读取。

注意的是,如果你有多个sql文件,他们被运行的顺序是无法保证的,你唯一能做的是,保证需要用的的数据表都是事先已经被创建好的

下面是一个例子:值得注意的是,这个初始化仅在第一次运行syncdb时创建

特定数据库后端的sql数据

django提供了特定后端的sql数据的钩子。特定后端的sql会被先运行(后端和ENGINE的值一样才起效)。举个例子,如果你的app包含sql/person.sql和sql/person.sqlite3.sql两个文件,并且数据库使用sqlite,django会先运行sql/person.sqlite3.sql,然后才运行sql/person.sql。相信这个例子很容易理解,django会先寻找文件<appname>/sql/<modelname>.<backend>.sql文件,<appname>是你的应用目录,<modelname>是你的模型的名字的小写形式,<backend>是你的数据库引擎。

django “如何”系列8:如何为模型提供初始化数据的更多相关文章

  1. [Asp.net MVC]Asp.net MVC5系列——从控制器访问模型中的数据

    目录 概述 从控制器访问模型中的数据 强类型模型与@model关键字 总结 系列文章 [Asp.net MVC]Asp.net MVC5系列——第一个项目 [Asp.net MVC]Asp.net M ...

  2. Django学习系列之重写User模型和登录验证

    重写User模型 Django内置的User模型可能不适合某些项目,我们可能要基于内置的添加一些字段 创建users app startapp users 修改settings.py配置文件,覆盖默认 ...

  3. Django学习系列15:把POST请求中的数据存入数据库

    要修改针对首页中的POST请求的测试.希望视图把新添加的待办事项存入数据库,而不是直接传给响应. 为了测试这个操作,要在现有的测试方法test_can_save_a_post_request中添加3行 ...

  4. django “如何”系列3:如何编写模型域(model filed)

    django自带很多的域类--CharField,DateField等等--,如果django的这些域都不能满足你精确的要求,那么你可以编写自己的模型域. django自带的域没有和数据库列类型一一对 ...

  5. Python+Django+SAE系列教程17-----authauth (认证与授权)系统1

    通过session,我们能够在多次浏览器请求中保持数据,接下来的部分就是用session来处理用户登录了. 当然,不能仅凭用户的一面之词,我们就相信,所以我们须要认证. 当然了,Django 也提供了 ...

  6. django用户认证系统——拓展 User 模型

    Django 用户认证系统提供了一个内置的 User 对象,用于记录用户的用户名,密码等个人信息.对于 Django 内置的 User 模型, 仅包含以下一些主要的属性: username,即用户名 ...

  7. Django 学习笔记(四) --- 模型和数据库

    人生苦短 ~ Tips:仅适用于 Python 3+(反正差别不大,py2 改改也能用).因为据 Python 之父 Guido van Rossum 说会在 2020 年停止对 Python 2 的 ...

  8. Netty系列之Netty线程模型

    Reference: http://www.infoq.com/cn/articles/netty-threading-model 1. 背景 1.1. Java线程模型的演进 1.1.1. 单线程 ...

  9. Django 1.10中文文档-模型参考

    模型字段 本文档包含了Django提供的全部模型 Field 包括 字段选项 和 字段类型 的API参考. 参见 如果内建的字段不能满足你的需求, 你可以蚕食 django-localflavor ( ...

随机推荐

  1. 放弃采用Mycat的条件

    Mycat::一个新颖的数据库中间件产品 设计使用Mycat时: 满足以下任意一条,请考虑放弃使用MyCat 有非分片字段查询 有分页排序 进行表JOIN操作,除非要确保两个表的关联字段具有相同的数据 ...

  2. ACE线程管理机制-并发控制

    ACE有若干可用于并发控制的类.这些类可划分为以下范畴: ACE Lock类属 ACE Guard类属 ACE Condition类属 ACE Synchronization类 由于篇幅较长,我分别写 ...

  3. best code #54 div 2 A 水

    A problem of sorting Accepts: 443 Submissions: 1696 Time Limit: 2000/1000 MS (Java/Others) Memory Li ...

  4. UVA:11183:Teen Girl Squad (有向图的最小生成树)

    Teen Girl Squad Description: You are part of a group of n teenage girls armed with cellphones. You h ...

  5. mybatis分页查询需要注意的问题

    一般对mybatis的分页查询的关键代码就两行: #currentPage代表当前页,pageSize代表每页的行数 PageHelper.startPage(currentPage, pageSiz ...

  6. 51Nod 1344 走格子 | 贪心

    Input示例 5 1 -2 -1 3 4 Output示例 2 贪心 #include <bits/stdc++.h> using namespace std; typedef long ...

  7. Go语言的并发和并行

    不知道你有没有注意到,这段代码如果我跑在两个goroutines里面的话: package main import ( "fmt" ) func loop(done chan bo ...

  8. [uva11806]容斥定理

    n*m的矩形 k个人 第一行,最后一行,第一列,最后一列都至少站有一个人 小水题 正着做不好做,要反着想,那就容斥定理,ABCD四种情况分别是那四个行列分别没有人. #include<cstdi ...

  9. 模板复习【updating】

    马上就要noi了……可能滚粗已经稳了……但是还是要复习模板啊 LCT: bzoj2049 1A 7min # include <stdio.h> # include <string. ...

  10. .net JsonHelper json帮助类

    using Newtonsoft.Json; using System.Runtime.Serialization.Json; using System.Text; public class Json ...