# 一、需求
**定义模型类,保存部门-员工数据**
* 部门类(Department)
* 部门名称: name
* 部门成立时间: create\_date
* 逻辑删除标识:is\_delete
* 员工类(Employee)
* 性名: name
* 年龄: age
* 性别: sex
* 工资: salary
* 入职时间: hire\_date
* 备注信息: comment
## 二、模型类定义
* 模型类被定义在`应用/models.py`文件中
* 模型类必须继承自`Django`的`models.Model`类
#### 1\. 属性定义
* 模型类属性与表字段一一对应
* 定义属性时,需要指定字段类型,通过字段类型的参数指定选项,格式如下:
* **属性名 = models.字段类型(字段选项)**
* 属性名不能是python的保留关键字
* 属性名不能使用连续的下划线(这是由django的查询方式决定的)
#### 2\. 关于主键
* 主键:primary key,简写 pk
* 不需要主动定义,django会自动生成自增长的主键,属性名叫`id`,
* 如果开发者自己定义了主键,则django不会再生成默认的主键
#### 3\. 表名
* 默认为:**应用名小写\_模型类名小写**
* 可通过通过`Meta`类指定表名,例如
~~~
# 如果应用名为users,则默认表名为:users_department
class Department(models.Model):
...
class Meta:
# 指定生成的数据库表的名字
db_table = 'department'
~~~
#### 4\. 字段类型
[官方文档:字段类型和选项](https://yiyibooks.cn/xx/Django_1.11.6/ref/models/fields.html)
| 类型 | 说明 |
| --- | --- |
| AutoField | 自动增长的IntegerField,通常不用指定,不指定时Django会自动创建名为id的自动增长属性 |
| BooleanField | 布尔字段,值为True或False |
| NullBooleanField | 支持Null、True、False三种值 |
| CharField | 字符串,**必须指定**:`max_length`,表示最大字符个数 |
| TextField | 大文本字段,一般超过4000个字符时使用 |
| IntegerField | 整数 |
| DecimalField | 十进制浮点数,用python中的Decimal实例来表示 必须指定:`max_digits`总位数,`decimal_places`小数位数。 |
| FloatField | 浮点数 |
| DateField | 日期 1,参数`auto_now`表示每次修改保存对象时,自动设置该字段为当前时间,用于保存"最后一次修改"时间,默认为False;2, 参数`auto_now_add`表示当对象第一次被创建时自动设置保存当前时间,用于保存"创建时间"时间,默认为值为False; 3, 参数`auto_now_add`和`auto_now`是相互排斥的,不能同时用到一个属性中 |
| TimeField | 时间,参数同DateField |
| DateTimeField | 日期时间,参数同DateField |
| FileField | 上传文件字段 |
| ImageField | 继承于FileField,对上传的内容进行校验,确保是有效的图片 |
#### 4\. 字段选项
| 选项 | 默认值 | 描述 | 是否要迁移修改表结构 |
| --- | --- | --- | --- |
| null | False | True表示表字段允许为空 | 是 |
| unique | False | True表示表字段不能重复 | 是 |
| db\_column | 属性名称 | 表字段名称 | 是 |
| primary\_key | False | True表示字段设置为了主键,一般作为AutoField的选项使用 | 是 |
| default | \- | 默认值 | 否 |
| blank | False | 在django管理后台新增或编辑一条表数据时,该字段是否允许为空;null是数据库范畴的概念,blank是表单验证范畴的 | 否 |
| choices | \- | 在django管理后台新增或编辑一条表数据时,该字段显示为下拉框,默认为编辑框 | 否 |
* choices: 性别属性使用了choices选项后,在录入一条数据时,会以下拉框显示
* blank:blank属性默认值为false, 表示录入一条数据时,当前字段必须填写,不能为空,否则js端js校验不通过,例如:下图的comment员工备注信息字段。
![image](../imgs/django-063.png)
#### 5\. 外键
关系型数据库的关系包括三种类型
* `ForeignKey`: 一对多,将`关联属性`定义在多的一端中
* `ManyToManyField`: 多对多,将`关联属性`定义任意一方中
* `OneToOneField`: 一对一,将`关联属性`定义在任意一方中
## 二、代码参考
部门和员工模型类 代码参考
~~~
class Department(models.Model):
"""部门类"""
# 部门名称:字符串类型(必须要指定最大长度)
name = models.CharField(max_length=20)
# 部门成立时间: 日期类型
create_date = models.DateField(auto_now_add=True)
# 逻辑删除标识:标识部门是否删除
is_delete = models.BooleanField(default=False)
def __str__(self):
return self.name
class Meta:
# 指定表名
db_table = 'department'
class Employee(models.Model):
"""员工类"""
choices_gender = (
(0, '男'),
(1, '女'),
)
name = models.CharField(max_length=20)
age = models.IntegerField()
gender = models.IntegerField(default=0, choices=choices_gender)
# 工资:浮点类型(必须要指定两个选项) 999999.99
salary = models.DecimalField(max_digits=8, decimal_places=2)
# 备注信息: 可以为空
comment = models.CharField(max_length=300, null=True, blank=True)
# 员工入职时间
hire_date = models.DateField(auto_now_add=True)
# 一对多的外键:员工所属部门 department_id
department = models.ForeignKey('Department')
def __str__(self):
return self.name
class Meta:
# 指定表名
db_table = 'employee'
~~~
- 基础
- 输入输出
- 常量变量
- 常量
- 变量
- 数据类型
- 简单数据类型
- 整型
- 浮点型
- 复数
- 复杂数据类型
- 序列
- 通用操作
- 字符串
- 定义
- 方法
- 格式化
- eval
- range
- capitalize
- count
- 格式化
- list
- 定义
- 方法
- tuple
- 定义
- 特点
- 方法
- dict
- 定义
- set
- 定义
- 类型转换
- 函数
- 定义
- 参数
- 函数变量
- 多返回值
- 作用域
- 函数嵌套
- 匿名函数
- 面向对象
- 类
- 对象
- 封装
- 私有
- property
- 类属性和实例属性
- 实例方法、静态方法和类方法
- 继承
- 多态
- 接口
- 设计原则
- 开放/封闭原则
- 控制反转原则
- 接口隔离原则
- 单一职责原则
- 替换原则
- 魔法方法
- 构造方法
- 析构方法
- 静态方法
- doc
- call
- dict
- str
- 异常
- with
- 提高
- 深浅拷贝
- 闭包
- 装饰器
- 正则表达式
- 单个字符
- 多个字符
- 开头结尾
- 分组
- 高级语法
- 网络编程
- 多任务
- 线程
- 创建线程
- 主线程等待
- 共享全局变量
- 传递参数
- 进程
- 创建
- 进程间通信
- 协程
- 数据库
- SQL
- 安装
- 备份
- 查询
- 消除重复行
- 分组
- 字查询
- Python 中操作 MySQL
- 设计模式
- 简介
- 三大类
- 创建型
- 单例
- 常用模块
- 导入模块
- 系统内置
- os
- time
- math
- help
- logging
- 格式
- 输出到控制台
- 输出到文件
- 两个都输出
- 三方模块
- Tesseract
- redis
- 安装
- selenium
- Selenium
- PhantomJS
- Chromedriver
- turtle
- 五角星
- 正方体
- urllib3
- http请求
- Requests
- 基本使用
- 发送请求
- cookies
- 代理
- Django
- 框架介绍
- 项目搭建
- 项目配置
- 路由
- 项目urls.py
- 应用urls.py
- 控制器
- request
- response
- Cookie
- Session
- views
- Models
- 数据库
- ORM
- 配置和迁移
- 模型类
- 模型管理器
- 增删改
- 查
- 查询集
- Mysql日志
- 自定义模型管理器
- 中间件
- scrapy
- 工作原理
- 创建项目
- spider
- items
- pipeline
- settings
- logging
- 小例子
- 果壳网
- 人人网登陆
- 腾讯招聘
- 创建模块
- 网络爬虫
- 基础知识
- 爬虫的用途
- robots协议
- http和https
- 常见请求头
- 状态码
- 字符串
- requests
- 简介
- 发送请求
- response
- 小技巧
- 代理
- cookie和session
- Fiddler
- 数据提取
- 数据分类
- json
- 正则
- xpath
- lxml
- 自动化运维
- Shell
- 开发规范
- 注释
- 脚本执行
- 变量
- 表达式
- 测试语句
- 条件表达式
- 逻辑表达式
- 文件表达式
- 数值操作符
- 字符串比较
- 计算表达式
- 常见符号
- 重定向符号
- 管道符
- 其他符号
- 常见命令
- grep
- sed
- awk
- find
- 流程控制
- if