• Django 对各种数据库提供了很好的支持,Django为这些数据库提供了统一的调用API,可以根据不同的业务需求选择不同的数据库。

如需了解更多,请访问: ​​https://www.emperinter.info/2022/05/29/django-models/​

ORM

  • 概述
  • 对象-映射-模型
  • 任务
  • 根据对象的类型生成表结构
  • 将对象、列表的操作转换为sql语句
  • 将SQL语句查询的结果转换为对象、列表
  • 优点
  • 极大的减轻了开发人员的工作量,不需要面对因数据库的变更而修改代码

流程

配置数据库

  • 在​​__init__.py​​文件中添加选定的数据库Package。
import pymysql  
pymysql.version_info = (2,0,3,"final",0)  
pymysql.install_as_MySQLdb()
  • 在​​settings.py​​文件中修改数据库配置。
DATABASES = {  
    'default': {  
        'ENGINE': 'django.db.backends.mysql',  
        'NAME': 'sunck', # 数据库名  
        'USER': 'sunk', # 数据库用户名  
        'PASSWORD': 'sunk', # 数据库密码  
        'HOST': 'localhost', # 数据库主机  
        'PORT': '3306', # 数据库端口  
    }  
}

在models.py 添加模型类

  • 一个模型类都在数据库中对应一张表

定义模型

模型、属性、表、字段间的关系

  • 一个模型类在数据库中对应一张表
  • 模型类中定义的属性,对应模型对照表中的字段

定义属性

概述

  • Django根据属性的类型确定以下信息
  • 当前选择的数据库支持字段的类型
  • 渲染管理表单时使用的默认html控件
  • 在管理站点最低限度的验证
  • Django会为表增加自动增加的主键列,每个模型只能有一个主键列,如果使用选项设置某属性为主键列后,则Django不会再生成默认的主键列。
  • 属性命名限制
  • 不能是Python的保留关键字(遵循标识符命名规则)
  • 由于Django的查询方式,不允许使用连续的下划线

  • 定义属性时,需要字段类型,字段类型被定义再​​django.db.modles.fields​​​目录下,为了方便使用,被导入到​​django.db.modles​​中
  • 使用方式:
  • 导入​​from django.db import models​
  • 通过​​modles.Field​​创建字段类型的对象,赋值给属性

逻辑删除

  • 对于重要数据都做逻辑删除,不能做物理删除,实现方法是定义​​isDelete​​​属性,类型为​​BooleanField​​​,默认值为​​False​​。

字段类型

字段类型

说明

​AutoField​

一个根据实际ID自动增长的IntergerField,通常不指定,如果不指定一个主键字段将自动添加到模型中

​CharField(max_length=字符长度)​

字符串,默认的表单样式是TextInput

​TextField​

大文本字段,一般超过4000字节使用,默认的表单控件是textArea

​IntegerField​

整数

​DecimalFiled(max_digits=None,decimal_places=None)​

使用Python的Decimal实例表示的十进制浮点数,max_digits表示位数总数,decimal_places表示小数点后的数字位数。[[精确的浮点运算-Decimal]]

​FloatField​

用Python的Float实例来表示的浮点数

​BooleanField​

true/false字段,此字段的默认表单控制是CheckboxInput

​NullBolleanField​

支持null、true、false三种值

​DateField([auto_now=False,auto_now_add=False])​

使用Python的Datetime.date实例表示的日期,auto_now表示每次保存对象是,自动设置该字段为当前时间,用于“最后一次修改”的时间戳,它总是使用当前日期,默认为False。auto_now_add表示当对象第一次被创建时自动设置当前时间,用于创建的时间戳,它总是使用当前时间,默认为False。说明:该字段默认对于表单控件是一个TextField,在管理员站点添加了一个JavaScript写的日历控件,和一个“Today”的快捷按钮,包含了一个额外的invalid_date错误消息键。注意:auto_now_add、auto_now、defalut这些设置是相互排斥的,他们之间的任何组合将会发生错误的结果。

​TimeField​

使用Python的datetime,datetime实例表示的日期和时间,参数同DateField

​FiledField​

一个上传文件的字段

​ImageField​

继承了FileField的所有属性和方法,但对上传的对象进行校验,确保它是一个有效的image

字段选项(字段参数)

  • 概述:
  • 通过字段选项,可以实现对字段的约束
  • 在字段对象是通过关键字参数指定
  • null
  • 如果为True,Django将空值已NULL存储到数据库中,默认是False
  • blanke
  • 如果为True,则该字段允许为空白,默认值是False
  • 注意:
  • null是数据库范畴的概念,blank是表单验证范畴的

  • db_column
  • 字段的名称,如未指定,则使用属性的名称
  • db_index
  • 若值为True,则在表中会为此字段创建索引
  • defalut
  • 默认值
  • primary_key
  • 若为True,则该字段会成为模型的主键字段
  • unique
  • 若为True,则该字段的值必须唯一

关系

  • 分类
  • ForeignKey:一对多,将字段定义在多的端中
  • ManyToManyField: 多对多,将字段定义在两端中
  • OneToOneField:一对一,将字段定义在任意一端中。
  • 用一访问多:
  • 格式: 对象.模型类小写_set
  • 示例:grade.students_set
  • 用一访问一:
  • 格式:对象.模型类小写
  • 示例:grade.students
  • 访问id:
  • 格式:对象.属性_id
  • 示例:student.sgrade_id

创建模型类

如需了解更多,请访问: ​​https://www.emperinter.info/2022/05/29/django-models/​