多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
# 一、需求 **定义模型类,保存部门-员工数据** * 部门类(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' ~~~