django “如何”系列8:如何为模型提供初始化数据
当你第一次配置一个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:如何为模型提供初始化数据的更多相关文章
- [Asp.net MVC]Asp.net MVC5系列——从控制器访问模型中的数据
目录 概述 从控制器访问模型中的数据 强类型模型与@model关键字 总结 系列文章 [Asp.net MVC]Asp.net MVC5系列——第一个项目 [Asp.net MVC]Asp.net M ...
- Django学习系列之重写User模型和登录验证
重写User模型 Django内置的User模型可能不适合某些项目,我们可能要基于内置的添加一些字段 创建users app startapp users 修改settings.py配置文件,覆盖默认 ...
- Django学习系列15:把POST请求中的数据存入数据库
要修改针对首页中的POST请求的测试.希望视图把新添加的待办事项存入数据库,而不是直接传给响应. 为了测试这个操作,要在现有的测试方法test_can_save_a_post_request中添加3行 ...
- django “如何”系列3:如何编写模型域(model filed)
django自带很多的域类--CharField,DateField等等--,如果django的这些域都不能满足你精确的要求,那么你可以编写自己的模型域. django自带的域没有和数据库列类型一一对 ...
- Python+Django+SAE系列教程17-----authauth (认证与授权)系统1
通过session,我们能够在多次浏览器请求中保持数据,接下来的部分就是用session来处理用户登录了. 当然,不能仅凭用户的一面之词,我们就相信,所以我们须要认证. 当然了,Django 也提供了 ...
- django用户认证系统——拓展 User 模型
Django 用户认证系统提供了一个内置的 User 对象,用于记录用户的用户名,密码等个人信息.对于 Django 内置的 User 模型, 仅包含以下一些主要的属性: username,即用户名 ...
- Django 学习笔记(四) --- 模型和数据库
人生苦短 ~ Tips:仅适用于 Python 3+(反正差别不大,py2 改改也能用).因为据 Python 之父 Guido van Rossum 说会在 2020 年停止对 Python 2 的 ...
- Netty系列之Netty线程模型
Reference: http://www.infoq.com/cn/articles/netty-threading-model 1. 背景 1.1. Java线程模型的演进 1.1.1. 单线程 ...
- Django 1.10中文文档-模型参考
模型字段 本文档包含了Django提供的全部模型 Field 包括 字段选项 和 字段类型 的API参考. 参见 如果内建的字段不能满足你的需求, 你可以蚕食 django-localflavor ( ...
随机推荐
- sourcemap总结
sourcemap在线上压缩文件调试中很重要,在此总结如下: 1. 开启sourcemap (1). 浏览器要开启source-map支持(2). 压缩文件底部要有source-map的URL,压缩要 ...
- [IOI2007]Miners 矿工配餐
link 其实就是一个比较简单的$IOI$题.简单$dp$就行,设$5$维$dp$即可 最后在滚动一下,判一下可行性即可. #include<iostream> #include<c ...
- Lua Go R HEXO Kotlin 简单介绍
Lua Lua使用C编写而成的脚本语言.同为脚本语言的Python拥有庞大的类库工具包,定位于独立开发,Lua极度精简化,没有提供太多功能包,必须与C.C++等语言混合使用,目的是为了快速并动态的嵌入 ...
- Django Session配置
Django Session的三种存储方式 SESSION_ENGINE='django.contrib.sessions.backends.db' # default 保存到数据库中,依赖 'dja ...
- 我们自己写的solr查询的代码作为search项目中的dao
我们自己写的solr查询的代码作为search项目中的dao,但是启动时会报错: 其实就是说 searchServiceImpl 中我们 Autowired 的 SearchDao 类 spring ...
- OopenCV复习及函数深入理解(轮廓查询及绘图)
核心函数:(后面标明号的,下面有解析) int cvFindContours(Iplimage* img,//这是输入函数,必须是8bit,单通道的图像---1 CvMemStorage* stora ...
- IntelliJ IDEA 热加载
修改java文件后 win按:Ctrl+Shift+F9 mac按:cmd+Shift+F9 tomcat-maven-plugin 启动的项目也用这个快捷键热加载
- 解决gitlab关闭登录选项问题
1.连接资料库 mysql -uroot -p 2.use gitlabhq_production; 3.进入后,输入下面语句UPDATE application_settings se ...
- Ajax请求Spring Mvc 时总是返回 302 Moved Temporarily
功能上主要是实现在前台点击保存按钮,单元格变成文本框,修改值后请求后台保存数据.但在做的过程中,ajax 请求总是不能请求到后.打开浏览器调试,查看到http状态码总是返回 http/1.1 302 ...
- codeforces——contest 864 problemE
Polycarp is in really serious trouble — his house is on fire! It's time to save the most valuable it ...