2 Model层 -定义模型
1 ORM简介
- MVC框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库
- ORM是“对象-关系-映射”的简称,主要任务是:
- 根据对象的类型生成表结构
- 将对象、列表的操作,转换为sql语句
- 将sql查询到的结果转换为对象、列表
- 这极大的减轻了开发人员的工作量,不需要面对因数据库变更而导致的无效劳动
- Django中的模型包含存储数据的字段和约束,对应着数据库中唯一的表
2 使用mysql 数据库
- 在虚拟环境中安装mysql包
- python@ubuntu:~$ workon h4
- (h4) python@ubuntu:~$ pip list
- (h4) python@ubuntu:~$ pip install mysql-python
- (h4) python@ubuntu:~/Desktop/projects$ django-admin startproject test2
- 在mysql中创建数据库
- python@ubuntu:~$ mysql -uroot -pmysql
- create databases test2 charset=utf8
- 打开settings.py文件,修改DATABASES项
- DATABASES = {
- 'default': {
- 'ENGINE': 'django.db.backends.mysql',
- 'NAME': 'test2',
- 'USER': '用户名',
- 'PASSWORD': '密码',
- 'HOST': '数据库服务器ip,本地可以使用localhost',
- 'PORT': '端口,默认为3306',
- }
- }
- 源代码 django.db.backends.mysql
- python@ubuntu:~$ cd .virtualenvs/
- python@ubuntu:~/.virtualenvs$ cd h4/
- python@ubuntu:~/.virtualenvs/h4$ cd lib/
- python@ubuntu:~/.virtualenvs/h4/lib$ cd python2./
- python@ubuntu:~/.virtualenvs/h4/lib/python2.$ cd site-packages/
- python@ubuntu:~/.virtualenvs/h4/lib/python2./site-packages$ ls
- django pip
- Django-1.8..dist-info pip-9.0..dist-info
- MySQLdb setuptools
- python@ubuntu:~/.virtualenvs/h4/lib/python2./site-packages$ cd django/
- python@ubuntu:~/.virtualenvs/h4/lib/python2./site-packages/django$ ls
- apps contrib dispatch __init__.py shortcuts.py templatetags views
- bin core forms __init__.pyc shortcuts.pyc test
- conf db http middleware template utils
- python@ubuntu:~/.virtualenvs/h4/lib/python2./site-packages/django$ cd db/
- python@ubuntu:~/.virtualenvs/h4/lib/python2./site-packages/django/db$ ls
- backends __init__.pyc models transaction.pyc utils.pyc
- __init__.py migrations transaction.py utils.py
- python@ubuntu:~/.virtualenvs/h4/lib/python2./site-packages/django/db$ cd backends/
- python@ubuntu:~/.virtualenvs/h4/lib/python2./site-packages/django/db/backends$ ls
- base __init__.pyc postgresql_psycopg2 sqlite3 utils.py
- dummy mysql signals.py util.py utils.pyc
- __init__.py oracle signals.pyc util.pyc
3. 开发流程
- 在models.py中定义模型类,要求继承自models.Model
- 把应用加入settings.py文件的installed_app项
- 生成迁移文件
- 执行迁移生成表
- 使用模型类进行crud操作
4.使用数据库生成模型类
- python manage.py inspectdb > booktest/models.py
- (h4) python@ubuntu:~/Desktop/projects/test2$ python manage.py startapp boostest
- INSTALLED_APPS = (
- 'django.contrib.admin',
- 'django.contrib.auth',
- 'django.contrib.contenttypes',
- 'django.contrib.sessions',
- 'django.contrib.messages',
- 'django.contrib.staticfiles',
- 'boostest',
- )
5.定义模型
- 在模型中定义属性,会生成表中的字段
- django根据属性的类型确定以下信息:
- 当前选择的数据库支持字段的类型
- 渲染管理表单时使用的默认html控件
- 在管理站点最低限度的验证
- django会为表增加自动增长的主键列,每个模型只能有一个主键列,如果使用选项设置某属性为主键列后,则django不会再生成默认的主键列
- 属性命名限制
- 不能是python的保留关键字
- 由于django的查询方式,不允许使用连续的下划线
6.字段类型
- AutoField:一个根据实际ID自动增长的IntegerField,通常不指定
- 如果不指定,一个主键字段将自动添加到模型中
- BooleanField:true/false 字段,此字段的默认表单控制是CheckboxInput
- NullBooleanField:支持null、true、false三种值
- CharField(max_length=字符长度):字符串,默认的表单样式是 TextInput
- TextField:大文本字段,一般超过4000使用,默认的表单控件是Textarea
- IntegerField:整数
- DecimalField(max_digits=None, decimal_places=None):使用python的Decimal实例表示的十进制浮点数
- DecimalField.max_digits:位数总数
- DecimalField.decimal_places:小数点后的数字位数
- FloatField:用Python的float实例来表示的浮点数
- DateField[auto_now=False, auto_now_add=False]):使用Python的datetime.date实例表示的日期
- 参数DateField.auto_now:每次保存对象时,自动设置该字段为当前时间,用于"最后一次修改"的时间戳,它总是使用当前日期,默认为false
- 参数DateField.auto_now_add:当对象第一次被创建时自动设置当前时间,用于创建的时间戳,它总是使用当前日期,默认为false
- 该字段默认对应的表单控件是一个TextInput. 在管理员站点添加了一个JavaScript写的日历控件,和一个“Today"的快捷按钮,包含了一个额外的invalid_date错误消息键
- auto_now_add, auto_now, and default 这些设置是相互排斥的,他们之间的任何组合将会发生错误的结果
- TimeField:使用Python的datetime.time实例表示的时间,参数同DateField
- DateTimeField:使用Python的datetime.datetime实例表示的日期和时间,参数同DateField
- FileField:一个上传文件的字段
- ImageField:继承了FileField的所有属性和方法,但对上传的对象进行校验,确保它是个有效的image
7.字段选项
- 通过字段选项,可以实现对字段的约束
- 在字段对象时通过关键字参数指定
- null:如果为True,Django 将空值以NULL 存储到数据库中,默认值是 False
- blank:如果为True,则该字段允许为空白,默认值是 False
- 对比:null是数据库范畴的概念,blank是表单验证证范畴的
- db_column:字段的名称,如果未指定,则使用属性的名称
- db_index:若值为 True, 则在表中会为此字段创建索引
- default:默认值
- primary_key:若为 True, 则该字段会成为模型的主键字段
- unique:如果为 True, 这个字段在表中必须有唯一值
8.关系
- 关系的类型包括
- ForeignKey:一对多,将字段定义在多的端中
- ManyToManyField:多对多,将字段定义在两端中
- OneToOneField:一对一,将字段定义在任意一端中
- 可以维护递归的关联关系,使用'self'指定,详见“自关联”
- 用一访问多:对象.模型类小写_set
- bookinfo.heroinfo_set
- 用一访问一:对象.模型类小写
- heroinfo.bookinfo
- 访问id:对象.属性_id
- heroinfo.book_id
9.元选项 Meta
- 在模型类中定义类Meta,用于设置元信息
- 元信息db_table:定义数据表名称,推荐使用小写字母,数据表的默认名称
- <app_name>_<model_name>
- ordering:对象的默认排序字段,获取对象的列表时使用,接收属性构成的列表
- class BookInfo(models.Model):
- ...
- class Meta():
- ordering = ['id']
- 字符串前加-表示倒序,不加-表示正序
- class BookInfo(models.Model):
- ...
- class Meta():
- ordering = ['-id']
- 排序会增加数据库的开销
10 示例演示
- 创建test2项目,并创建booktest应用,使用mysql数据库
生成迁移文件
- (h4) python@ubuntu:~/Desktop/projects/test2$ python manage.py makemigrations
- Migrations for 'boostest':
- 0001_initial.py:
- - Create model BookInfo
- - Create model HeroInfo
执行迁移:执行sql语句生成数据表
- (h4) python@ubuntu:~/Desktop/projects/test2$ python manage.py migrate
- mysql> show tables;
- +----------------------------+
- | Tables_in_test2 |
- +----------------------------+
- | auth_group |
- | auth_group_permissions |
- | auth_permission |
- | auth_user |
- | auth_user_groups |
- | auth_user_user_permissions |
- | bookinfo |
- | boostest_heroinfo |
- | django_admin_log |
- | django_content_type |
- | django_migrations |
- | django_session |
- +----------------------------+
- mysql> desc bookinfo;
- +----------+-------------+------+-----+---------+----------------+
- | Field | Type | Null | Key | Default | Extra |
- +----------+-------------+------+-----+---------+----------------+
- | id | int() | NO | PRI | NULL | auto_increment |
- | btitle | varchar() | NO | | NULL | |
- | pub_date | datetime() | NO | | NULL | |
- | bread | int() | NO | | NULL | |
- | bcommet | int() | YES | | NULL | |
- | isDelete | tinyint() | NO | | NULL | |
- +----------+-------------+------+-----+---------+----------------+
- mysql> desc boostest_heroinfo;
- +----------+---------------+------+-----+---------+----------------+
- | Field | Type | Null | Key | Default | Extra |
- +----------+---------------+------+-----+---------+----------------+
- | id | int() | NO | PRI | NULL | auto_increment |
- | hname | varchar() | NO | | NULL | |
- | hgender | tinyint() | NO | | NULL | |
- | hcontent | varchar() | NO | | NULL | |
- | isDelete | tinyint() | NO | | NULL | |
- | book_id | int() | NO | MUL | NULL | |
- +----------+---------------+------+-----+---------+----------------+
- rows in set (0.00 sec)
- 定义图书模型
- class BookInfo(models.Model):
- """书本信息"""
- btitle = models.CharField(max_length=)
- bpub_date = models.DateTimeField(db_column='pub_date') # 别名
- bread = models.IntegerField(default=)
- bcommet = models.IntegerField(null=True) # 整数
- isDelete = models.BooleanField(default=False)
- class Meta: # 元数据选项
- db_table = 'bookinfo' # 默认表名字 booktest_BookInfo
- # ordering = ['id'] # 排序规则
- 英雄模型
- class HeroInfo(models.Model):
- """英雄信息表"""
- hname = models.CharField(max_length=)
- hgender = models.BooleanField(default=True)
- hcontent = models.CharField(max_length=)
- isDelete = models.BooleanField(default=False)
- book = models.ForeignKey(BookInfo) # 外键 一本书对应多个英雄
- 定义index、detail视图
- index.html、detail.html模板
- 配置url,能够完成图书及英雄的展示
11.测试数据
- 模型BookInfo的测试数据
- insert into booktest_bookinfo(btitle,bpub_date,bread,bcommet,isDelete) values
- ('射雕英雄传','1980-5-1',,,),
- ('天龙八部','1986-7-24',,,),
- ('笑傲江湖','1995-12-24',,,),
- ('雪山飞狐','1987-11-11',,,)
- 模型HeroInfo的测试数据
- insert into booktest_heroinfo(hname,hgender,hbook_id,hcontent,isDelete) values
- ('郭靖',,,'降龙十八掌',),
- ('黄蓉',,,'打狗棍法',),
- ('黄药师',,,'弹指神通',),
- ('欧阳锋',,,'蛤蟆功',),
- ('梅超风',,,'九阴白骨爪',),
- ('乔峰',,,'降龙十八掌',),
- ('段誉',,,'六脉神剑',),
- ('虚竹',,,'天山六阳掌',),
- ('王语嫣',,,'神仙姐姐',),
- ('令狐冲',,,'独孤九剑',),
- ('任盈盈',,,'弹琴',),
- ('岳不群',,,'华山剑法',),
- ('东方不败',,,'葵花宝典',),
- ('胡斐',,,'胡家刀法',),
- ('苗若兰',,,'黄衣',),
- ('程灵素',,,'医术',),
- ('袁紫衣',,,'六合拳',)
2 Model层 -定义模型的更多相关文章
- DjangoMTV模型之model层——ORM操作数据库(基本增删改查)
Django的数据库相关操作 对象关系映射(英语:(Object Relational Mapping,简称ORM),是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换.从效果上说 ...
- 计算机网络七层协议模型 “开放系统互联参考模型”,即著名的OSI/RM模型(Open System Interconnection/Reference Model)
计算机网络七层协议模型 作者:Ryan 时间:2013年10月7日 一.物理层(Physical Layer) OSI模型的最低层或第一层,规定了激活.维持.关闭通信端点之间的机械特性.电气特性 ...
- TP框架---Model模型层---做模型对象
TP框架----Model模型层---------------做模型对象 Model模型层是用来做什么的呢???? 主要是用来做操作数据库访问的. 也就说明TP框架自带了一种访问数据库的方式,使用的是 ...
- Django进阶Model篇002 - 模型类的定义
一.创建数据模型. 实例: 作者模型:一个作者有姓名. 作者详情模型:把作者的详情放到详情表,包含性别.email 地址和出生日期,作者详情模型与作者模型之间是一对一的关系(OneToOneField ...
- 2 Model层-模型成员
1 类的属性 objects:是Manager类型的对象,用于与数据库进行交互 当定义模型类时没有指定管理器,则Django会为模型类提供一个名为objects的管理器 支持明确指定模型类的管理器 c ...
- Django模型Model的定义
概述 Django对各种数据库提供了很好的支持,Django为这些数据库提供了统一的调用API,可以根据不同的业务需求选择不同的数据库. 模型.属性.表.字段间的关系 一个模型类在数据库中对应一张表, ...
- HTML5学习+javascript学习:打飞机游戏简介以及Model层
本着好记性不如烂博客以及分享成功的喜悦和分享失败的苦楚,今天我来分享下一个练手项目:打飞机游戏~从小就自己想做游戏,可是一直没有机会.HTML5给了我们这个平台,这个平台可以有很多以前想都不敢想的东西 ...
- 读书笔记_MVC__关于通过js构建ORM,实现Model层
最近一直在学习MVC构建富应用的WEB程序,自己一直对MVC的设计模式理解的不是十分透彻,终于在研读了github上Spine的源码之后,对构建Model层有了一点自己的理解. 本文仅为个人理解,如有 ...
- 深度学习之Attention Model(注意力模型)
1.Attention Model 概述 深度学习里的Attention model其实模拟的是人脑的注意力模型,举个例子来说,当我们观赏一幅画时,虽然我们可以看到整幅画的全貌,但是在我们深入仔细地观 ...
随机推荐
- 什么是Spring
之前已经学习过web三层(数据库链接层dao,业务逻辑控制层service,用户层web). 在开发过程中,我们不断引入更加优秀的工具的目的都是在安全.高效的基础上,简化开发,和易于维护. 所以引入s ...
- String在方法中的传递方式(调用外部方法给String变量赋值时,未得到预期结果)
示例: public class StringTraining { public static void changeStr(String str){ str = "137878" ...
- Android自定义控件练手——简单的时钟
首先这应该是一个老生常谈的设计了,但是毕竟身为小白的自己都没动手做过,不动手怎么提高自己呢,所以在这梅林沉船闲暇之际,我就把我的设计流程与思路记录下来.首先来看看效果图吧: 如上图就是一个简单并没有美 ...
- 3D向2D投影
http://blog.sina.com.cn/s/blog_536e0eaa0100jn7j.html
- 使用Loadrunner监控Windows资源
为了区分把装有loadrunner的机器称作A,被监控资源的服务器(windows)称作B 1.确保B机器Administrator账户是可使用状态:右键计算机→ 管理→ 本地用户和组→ 用户,其中A ...
- 华为服务器操作系统EulerOS V2.0
平台: linux 类型: 虚拟机镜像 软件包: java-1.8.0 php-5.4.16 python-2.7.5 qt-4.8.5 tomcat-7.0.69 basic software eu ...
- SQLServer从其他表获取的数据更新该表的一部分
在网上常见的是update a set username = username FROM b on a.userid=b.userid,该更新语句是对a表中所有行进行更新.如果只更新一部 ...
- linux 命令——36 diff(转)
diff命令是 linux上非常重要的工具,用于比较文件的内容,特别是比较两个版本不同的文件以找到改动的地方.diff在命令行中打印每一个行的改动.最新版本的diff还支持二进制文件.diff程序的输 ...
- 写在Github被微软收购之际 - Github的那些另类用法
这几天朋友圈被微软75亿美元收购Github的新闻刷屏了.Jerry也来贡献一篇和Github相关的文章. 这篇文章包含了Jerry平时对于Github的一些另类用法.目录如下: 1. 部署HTML应 ...
- iOS界面设计切图小结
iOS界面设计切图小结 APR 12TH, 2013 1.基本尺寸 (1)界面 实际设计时按: iPhone4.4s:640px*960px iPhone5: 640px*1136px iPad:15 ...