1  ORM简介

  • MVC框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库
  • ORM是“对象-关系-映射”的简称,主要任务是:
    • 根据对象的类型生成表结构
    • 将对象、列表的操作,转换为sql语句
    • 将sql查询到的结果转换为对象、列表
  • 这极大的减轻了开发人员的工作量,不需要面对因数据库变更而导致的无效劳动
  • Django中的模型包含存储数据的字段和约束,对应着数据库中唯一的表

2 使用mysql 数据库

  • 在虚拟环境中安装mysql包
  1. python@ubuntu:~$ workon h4
  2. (h4) python@ubuntu:~$ pip list
  3. (h4) python@ubuntu:~$ pip install mysql-python
  1. (h4) python@ubuntu:~/Desktop/projects$ django-admin startproject test2
  • 在mysql中创建数据库
  1. python@ubuntu:~$ mysql -uroot -pmysql
  2. create databases test2 charset=utf8
  • 打开settings.py文件,修改DATABASES项
  1. DATABASES = {
  2. 'default': {
  3. 'ENGINE': 'django.db.backends.mysql',
  4. 'NAME': 'test2',
  5. 'USER': '用户名',
  6. 'PASSWORD': '密码',
  7. 'HOST': '数据库服务器ip,本地可以使用localhost',
  8. 'PORT': '端口,默认为3306',
  9. }
  10. }

  • 源代码  django.db.backends.mysql
  1. python@ubuntu:~$ cd .virtualenvs/
  2. python@ubuntu:~/.virtualenvs$ cd h4/
  3. python@ubuntu:~/.virtualenvs/h4$ cd lib/
  4. python@ubuntu:~/.virtualenvs/h4/lib$ cd python2./
  5. python@ubuntu:~/.virtualenvs/h4/lib/python2.$ cd site-packages/
  6. python@ubuntu:~/.virtualenvs/h4/lib/python2./site-packages$ ls
  7. django pip
  8. Django-1.8..dist-info pip-9.0..dist-info
  9. MySQLdb setuptools
  10.  
  11. python@ubuntu:~/.virtualenvs/h4/lib/python2./site-packages$ cd django/
  12. python@ubuntu:~/.virtualenvs/h4/lib/python2./site-packages/django$ ls
  13. apps contrib dispatch __init__.py shortcuts.py templatetags views
  14. bin core forms __init__.pyc shortcuts.pyc test
  15. conf db http middleware template utils
  16. python@ubuntu:~/.virtualenvs/h4/lib/python2./site-packages/django$ cd db/
  17. python@ubuntu:~/.virtualenvs/h4/lib/python2./site-packages/django/db$ ls
  18. backends __init__.pyc models transaction.pyc utils.pyc
  19. __init__.py migrations transaction.py utils.py
  20. python@ubuntu:~/.virtualenvs/h4/lib/python2./site-packages/django/db$ cd backends/
  21. python@ubuntu:~/.virtualenvs/h4/lib/python2./site-packages/django/db/backends$ ls
  22. base __init__.pyc postgresql_psycopg2 sqlite3 utils.py
  23. dummy mysql signals.py util.py utils.pyc
  24. __init__.py oracle signals.pyc util.pyc

3. 开发流程

  1. 在models.py中定义模型类,要求继承自models.Model
  2. 把应用加入settings.py文件的installed_app项
  3. 生成迁移文件
  4. 执行迁移生成表
  5. 使用模型类进行crud操作

4.使用数据库生成模型类

  1. python manage.py inspectdb > booktest/models.py
  1. (h4) python@ubuntu:~/Desktop/projects/test2$ python manage.py startapp boostest
  1. INSTALLED_APPS = (
  2. 'django.contrib.admin',
  3. 'django.contrib.auth',
  4. 'django.contrib.contenttypes',
  5. 'django.contrib.sessions',
  6. 'django.contrib.messages',
  7. 'django.contrib.staticfiles',
  8. 'boostest',
  9. )



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
  1. bookinfo.heroinfo_set
  • 用一访问一:对象.模型类小写
  1. heroinfo.bookinfo
  • 访问id:对象.属性_id
  1. heroinfo.book_id

9.元选项 Meta

  • 在模型类中定义类Meta,用于设置元信息
  • 元信息db_table:定义数据表名称,推荐使用小写字母,数据表的默认名称
  1. <app_name>_<model_name>
  • ordering:对象的默认排序字段,获取对象的列表时使用,接收属性构成的列表
  1. class BookInfo(models.Model):
  2. ...
  3. class Meta():
  4. ordering = ['id']
  • 字符串前加-表示倒序,不加-表示正序
  1. class BookInfo(models.Model):
  2. ...
  3. class Meta():
  4. ordering = ['-id']
  • 排序会增加数据库的开销

10 示例演示

  • 创建test2项目,并创建booktest应用,使用mysql数据库

  生成迁移文件

  1. (h4) python@ubuntu:~/Desktop/projects/test2$ python manage.py makemigrations
  2. Migrations for 'boostest':
  3. 0001_initial.py:
  4. - Create model BookInfo
  5. - Create model HeroInfo

执行迁移:执行sql语句生成数据表

  1. (h4) python@ubuntu:~/Desktop/projects/test2$ python manage.py migrate
  1. mysql> show tables;
  2. +----------------------------+
  3. | Tables_in_test2 |
  4. +----------------------------+
  5. | auth_group |
  6. | auth_group_permissions |
  7. | auth_permission |
  8. | auth_user |
  9. | auth_user_groups |
  10. | auth_user_user_permissions |
  11. | bookinfo |
  12. | boostest_heroinfo |
  13. | django_admin_log |
  14. | django_content_type |
  15. | django_migrations |
  16. | django_session |
  17. +----------------------------+
  1. mysql> desc bookinfo;
  2. +----------+-------------+------+-----+---------+----------------+
  3. | Field | Type | Null | Key | Default | Extra |
  4. +----------+-------------+------+-----+---------+----------------+
  5. | id | int() | NO | PRI | NULL | auto_increment |
  6. | btitle | varchar() | NO | | NULL | |
  7. | pub_date | datetime() | NO | | NULL | |
  8. | bread | int() | NO | | NULL | |
  9. | bcommet | int() | YES | | NULL | |
  10. | isDelete | tinyint() | NO | | NULL | |
  11. +----------+-------------+------+-----+---------+----------------+
  1. mysql> desc boostest_heroinfo;
  2. +----------+---------------+------+-----+---------+----------------+
  3. | Field | Type | Null | Key | Default | Extra |
  4. +----------+---------------+------+-----+---------+----------------+
  5. | id | int() | NO | PRI | NULL | auto_increment |
  6. | hname | varchar() | NO | | NULL | |
  7. | hgender | tinyint() | NO | | NULL | |
  8. | hcontent | varchar() | NO | | NULL | |
  9. | isDelete | tinyint() | NO | | NULL | |
  10. | book_id | int() | NO | MUL | NULL | |
  11. +----------+---------------+------+-----+---------+----------------+
  12. rows in set (0.00 sec)
  • 定义图书模型
  1. class BookInfo(models.Model):
  2. """书本信息"""
  3. btitle = models.CharField(max_length=)
  4. bpub_date = models.DateTimeField(db_column='pub_date') # 别名
  5. bread = models.IntegerField(default=)
  6. bcommet = models.IntegerField(null=True) # 整数
  7. isDelete = models.BooleanField(default=False)
  8.  
  9. class Meta: # 元数据选项
  10. db_table = 'bookinfo' # 默认表名字 booktest_BookInfo
  11. # ordering = ['id'] # 排序规则
  • 英雄模型
  1. class HeroInfo(models.Model):
  2. """英雄信息表"""
  3. hname = models.CharField(max_length=)
  4. hgender = models.BooleanField(default=True)
  5. hcontent = models.CharField(max_length=)
  6. isDelete = models.BooleanField(default=False)
  7. book = models.ForeignKey(BookInfo) # 外键 一本书对应多个英雄
  • 定义index、detail视图
  • index.html、detail.html模板
  • 配置url,能够完成图书及英雄的展示

11.测试数据

  • 模型BookInfo的测试数据
  1. insert into booktest_bookinfo(btitle,bpub_date,bread,bcommet,isDelete) values
  2. ('射雕英雄传','1980-5-1',,,),
  3. ('天龙八部','1986-7-24',,,),
  4. ('笑傲江湖','1995-12-24',,,),
  5. ('雪山飞狐','1987-11-11',,,)
  • 模型HeroInfo的测试数据
  1. insert into booktest_heroinfo(hname,hgender,hbook_id,hcontent,isDelete) values
  2. ('郭靖',,,'降龙十八掌',),
  3. ('黄蓉',,,'打狗棍法',),
  4. ('黄药师',,,'弹指神通',),
  5. ('欧阳锋',,,'蛤蟆功',),
  6. ('梅超风',,,'九阴白骨爪',),
  7. ('乔峰',,,'降龙十八掌',),
  8. ('段誉',,,'六脉神剑',),
  9. ('虚竹',,,'天山六阳掌',),
  10. ('王语嫣',,,'神仙姐姐',),
  11. ('令狐冲',,,'独孤九剑',),
  12. ('任盈盈',,,'弹琴',),
  13. ('岳不群',,,'华山剑法',),
  14. ('东方不败',,,'葵花宝典',),
  15. ('胡斐',,,'胡家刀法',),
  16. ('苗若兰',,,'黄衣',),
  17. ('程灵素',,,'医术',),
  18. ('袁紫衣',,,'六合拳',)

2 Model层 -定义模型的更多相关文章

  1. DjangoMTV模型之model层——ORM操作数据库(基本增删改查)

    Django的数据库相关操作 对象关系映射(英语:(Object Relational Mapping,简称ORM),是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换.从效果上说 ...

  2. 计算机网络七层协议模型 “开放系统互联参考模型”,即著名的OSI/RM模型(Open System Interconnection/Reference Model)

    计算机网络七层协议模型 作者:Ryan    时间:2013年10月7日 一.物理层(Physical Layer) OSI模型的最低层或第一层,规定了激活.维持.关闭通信端点之间的机械特性.电气特性 ...

  3. TP框架---Model模型层---做模型对象

    TP框架----Model模型层---------------做模型对象 Model模型层是用来做什么的呢???? 主要是用来做操作数据库访问的. 也就说明TP框架自带了一种访问数据库的方式,使用的是 ...

  4. Django进阶Model篇002 - 模型类的定义

    一.创建数据模型. 实例: 作者模型:一个作者有姓名. 作者详情模型:把作者的详情放到详情表,包含性别.email 地址和出生日期,作者详情模型与作者模型之间是一对一的关系(OneToOneField ...

  5. 2 Model层-模型成员

    1 类的属性 objects:是Manager类型的对象,用于与数据库进行交互 当定义模型类时没有指定管理器,则Django会为模型类提供一个名为objects的管理器 支持明确指定模型类的管理器 c ...

  6. Django模型Model的定义

    概述 Django对各种数据库提供了很好的支持,Django为这些数据库提供了统一的调用API,可以根据不同的业务需求选择不同的数据库. 模型.属性.表.字段间的关系 一个模型类在数据库中对应一张表, ...

  7. HTML5学习+javascript学习:打飞机游戏简介以及Model层

    本着好记性不如烂博客以及分享成功的喜悦和分享失败的苦楚,今天我来分享下一个练手项目:打飞机游戏~从小就自己想做游戏,可是一直没有机会.HTML5给了我们这个平台,这个平台可以有很多以前想都不敢想的东西 ...

  8. 读书笔记_MVC__关于通过js构建ORM,实现Model层

    最近一直在学习MVC构建富应用的WEB程序,自己一直对MVC的设计模式理解的不是十分透彻,终于在研读了github上Spine的源码之后,对构建Model层有了一点自己的理解. 本文仅为个人理解,如有 ...

  9. 深度学习之Attention Model(注意力模型)

    1.Attention Model 概述 深度学习里的Attention model其实模拟的是人脑的注意力模型,举个例子来说,当我们观赏一幅画时,虽然我们可以看到整幅画的全貌,但是在我们深入仔细地观 ...

随机推荐

  1. 什么是Spring

    之前已经学习过web三层(数据库链接层dao,业务逻辑控制层service,用户层web). 在开发过程中,我们不断引入更加优秀的工具的目的都是在安全.高效的基础上,简化开发,和易于维护. 所以引入s ...

  2. String在方法中的传递方式(调用外部方法给String变量赋值时,未得到预期结果)

    示例: public class StringTraining { public static void changeStr(String str){ str = "137878" ...

  3. Android自定义控件练手——简单的时钟

    首先这应该是一个老生常谈的设计了,但是毕竟身为小白的自己都没动手做过,不动手怎么提高自己呢,所以在这梅林沉船闲暇之际,我就把我的设计流程与思路记录下来.首先来看看效果图吧: 如上图就是一个简单并没有美 ...

  4. 3D向2D投影

    http://blog.sina.com.cn/s/blog_536e0eaa0100jn7j.html

  5. 使用Loadrunner监控Windows资源

    为了区分把装有loadrunner的机器称作A,被监控资源的服务器(windows)称作B 1.确保B机器Administrator账户是可使用状态:右键计算机→ 管理→ 本地用户和组→ 用户,其中A ...

  6. 华为服务器操作系统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 ...

  7. SQLServer从其他表获取的数据更新该表的一部分

    在网上常见的是update  a  set  username  =  username  FROM b  on a.userid=b.userid,该更新语句是对a表中所有行进行更新.如果只更新一部 ...

  8. linux 命令——36 diff(转)

    diff命令是 linux上非常重要的工具,用于比较文件的内容,特别是比较两个版本不同的文件以找到改动的地方.diff在命令行中打印每一个行的改动.最新版本的diff还支持二进制文件.diff程序的输 ...

  9. 写在Github被微软收购之际 - Github的那些另类用法

    这几天朋友圈被微软75亿美元收购Github的新闻刷屏了.Jerry也来贡献一篇和Github相关的文章. 这篇文章包含了Jerry平时对于Github的一些另类用法.目录如下: 1. 部署HTML应 ...

  10. iOS界面设计切图小结

    iOS界面设计切图小结 APR 12TH, 2013 1.基本尺寸 (1)界面 实际设计时按: iPhone4.4s:640px*960px iPhone5: 640px*1136px iPad:15 ...