django “如何”系列8:如何为模型提供初始化数据

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

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

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

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

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

这是像yaml的固定格式

- model: myapp.person
  pk: 1
  fields:
    first_name: John
    last_name: Lennon
- model: myapp.person
  pk: 2
  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文件,他们被运行的顺序是无法保证的,你唯一能做的是,保证需要用的的数据表都是事先已经被创建好的

特定数据库后端的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>是你的数据库引擎。

时间: 2024-10-11 00:29:26

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

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

目录 概述 从控制器访问模型中的数据 强类型模型与@model关键字 总结 系列文章 [Asp.net MVC]Asp.net MVC5系列——第一个项目 [Asp.net MVC]Asp.net MVC5系列——添加视图 [Asp.net MVC]Asp.net MVC5系列——添加模型 概述 上篇文章介绍了如何添加Model,在这篇文章中,我们将通过控制器访问模型中的数据,还有有写朋友问我,这么简单的东西有必要分享吗?其实有些东西真的很简单,没必要分享,但是这也是我学习的历程,希望记录自己是

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

django自带很多的域类--CharField,DateField等等--,如果django的这些域都不能满足你精确的要求,那么你可以编写自己的模型域. django自带的域没有和数据库列类型一一对应的,只有简单的VARCHAR,INTEGER等类型,为了使用更复杂的类型,例如多边形,你可以定义你的域子类:或者,你可能有一个很复杂的对象,这个对象可以通过某些方法序列化标准的数据库列类型,那么你可以定义自己的域子类. 示例对象 创建自定义的域需要注意一些特别的问题,为了使问题更简单的得以阐述,我

Netty系列之Netty线程模型

1. 背景 1.1. Java线程模型的演进 1.1.1. 单线程 时间回到十几年前,那时主流的CPU都还是单核(除了商用高性能的小机),CPU的核心频率是机器最重要的指标之一. 在Java领域当时比较流行的是单线程编程,对于CPU密集型的应用程序而言,频繁的通过多线程进行协作和抢占时间片反而会降低性能. 1.1.2. 多线程 随着硬件性能的提升,CPU的核数越来越越多,很多服务器标配已经达到32或64核.通过多线程并发编程,可以充分利用多核CPU的处理能力,提升系统的处理效率和并发性能. 相关

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

通过session,我们可以在多次浏览器请求中保持数据,接下来的部分就是用session来处理用户登录了. 当然,不能仅凭用户的一面之词,我们就相信,所以我们需要认证. 当然了,Django 也提供了工具来处理这样的常见任务(就像其他常见任务一样). Django 用户认证系统处理用户帐号,组,权限以及基于cookie的用户会话.这个系统一般被称为 auth/auth (认证与授权)系统. 这个系统的名称同时也表明了用户常见的两步处理. 我们需要: 1.     验证 (认证) 用户是否是他所宣

Python+Django+SAE系列教程12-----配置MySQL数据库

因为SAE上支持的是Mysql,首先我们要在本地配置一个Mysql的环境 ,我在网上找到MySQL-python-1.2.4b4.win32-py2.7.exe,并双击 安装 选择典型安装 安装结束后,会弹出配置数据库的界面 : 然后输数据管理员密码: 最后是运行服务. 这个过程并不复杂,安装完成Mysql以后,系统会启动数据库服务,由于Mysql是用命令行控制的,想我这样懒的 人还是需要借助一个可视化 工具来管理,我选择MySQL-Front. 在网上找到MySQL_Front_Setup.1

asp.net core系列 48 Identity 身份模型自定义

原文:asp.net core系列 48 Identity 身份模型自定义 一.概述 ASP.NET Core Identity提供了一个框架,用于管理和存储在 ASP.NET Core 应用中的用户帐户. Identity添加到项目时单个用户帐户选择作为身份验证机制. 默认情况下,Identity可以使用的 Entity Framework (EF) Core 数据模型. 本文介绍如何自定义的身份标识模型. 1.1 下面是已经存在的身份模型, 由以下实体类型组成: 实体类型 说明 关系 Use

Django开发运维后台(二):建立模型与更新数据

上一篇文章我已经新建了一个SaAdmin的APP,现在开始在这APP下面来code 1.修改setting.py的数据库连接: DATABASES = {     'default': {         'ENGINE':'django.db.backends.mysql',         'NAME': 'QjshAdmin',         'USER': 'root',         'PASSWORD': 'lihuipeng',         'HOST': 'localho

Django学习笔记(三)—— 模型 model

疯狂的暑假学习之 Django学习笔记(三)-- 模型 model 参考:<The Django Book> 第5章 1.setting.py 配置 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.', # 用什么数据库管理系统 'NAME': '', # 数据库名称,如果用sqlite,要写完整路径 'USER': '', # 如果用sqlite,这个不用写 'PASSWORD': '', # 如果用sqlite,这个不用写

我给女朋友讲编程CSS系列(4) CSS盒子模型

什么是CSS盒子模型?如何学习CSS的盒子模型? 这篇文章,以 [分享 + 结论]  的方式来写. 1,  看w3school的[CSS 框模型概述] 网址为: http://www.w3school.com.cn/css/css_boxmodel.asp 接着把[CSS内边距],[CSS外边距],[CSS外边距合并]看看. 小结: (1)    一般,在样式表中,都会先把所有元素的外边距和内边距设置为0 * {   margin: 0;  padding: 0;  } * 是通配符,就是一个符