简介
django为各种数据库提供了很好的支持,django对这些数据库提供了统一的调用API;可以根据不同的也无需求选择不同的数据库;
-
配置数据库
-
在setting.py文件中配置数据库
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'sundb', 'USER':'root', 'PASSWORD':'ilovedata', 'HOST':'localhost', 'PORT':'3306', } }
-
在工程目录下修改__init.py__文件
import pymysql pymysql.install_as_MySQLdb()
-
-
定义模型类
** 一个模型类在数据库中对应一张数据表 **
-
生成迁移文件
-
使用模型类进行增删改查CRUD
ORM
-
简介
ORM: 对象关系映射
Django↔ORM↔DB
-
任务
- 模型对象的类型生成表结构
- 将对象/列表的操作转换为sql语句
- 将sql语句查询到的结果转换为对象/列表
- 优点
极大的减轻了开发人员的工作量,不需要面对因数据库的变更而修改代码
定义模型
模型/属性/表/字段之间的关系
一个模型类在数据库中对应一张表,在模型类中定义的属性,对应该模型对照表中的一个字段;
定义属性
概述
- Django根据属性的类型定义以下信息
- 当前选择的数据库支持字段的类型
- 渲染管理表单时使用的默认HTML控件
- 在管理站点最低限度的验证
- Django会为表增加自动增长的主键列, 每个模型只能有一个主键列,如果使用选项设置某属性为主键列后, 则Django不会再生成默认的主键列
- 属性命名限制
- 不能使python的保留关键字
- 由于django的查询方式, 不允许使用连续的下划线
库
- 定义属性时,需要字段类型, 字段类型被定义在django.db.models.fields目录下, 为了方便使用, 被导入到django.db.models中;
- 使用方式
- 导入from django.db import models
- 通过models.Field 创建字段类型的对象, 赋值给属性
逻辑删除
对于重要数据都做逻辑删除, 不做物理删除, 实现方法是定义isDelete属性, 类型为BooleanField, 默认值是False.
字段类型
-
AutoField
- 一个根据实际ID自动增长的IntegerField字段, 通常不指定;如果不指定, Django会自动添加;
-
Charfield(max_lenght=字符长度)
- 字符串, 默认的表单样式是 TextInput
-
TextField
大文本字段, 一般超过4000时使用, 默认的表单控件是Textarea
-
IntegerField
整数
-
DecimalField(max_digits=None, decimal_places=None)
- 使用Python的Decimal实例表示的十进制浮点数
- 参数说明
- DecimalField.max_digits
- 位数总数
- DecimalField.decimal_places
- 小数后的数字位数
- DecimalField.decimal_places
-
FloatField
- 用python的float实例来表示的浮点数
-
BooleanField
- True/False 字段, 此字段的默认表单控制是CheckboxInput
-
NullBooleanField
- 支持Null/True/False 三种值
-
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
字段选项
-
概述
- 通过字段选项,可以实现对字段的约束
- 在字段对象创建时, 通过关键字参数制定
-
Null
如果为True, Django将空值以Null 存储到数据库中, 默认值是False;
-
blank
如果为True , 则允许该字段为空白, 默认值是False;
注意: Null是数据库范畴的概念, blank则属表单范畴;
-
db_column
字段的名称, 如果未指定, 则使用属性的名称
-
db_index
若值为True, 则在表中会为此字段创建索引;
-
default
默认值
-
primary_key
若为True, 则该字段会成为模型中的主键字段
-
unique
如果为True, 则这个字段在表中必须有唯一值
关系
-
分类
- ForeignKey: 一对多, 将字段定义在多的一端;
- ManyToManyField: 多对多, 将字段定义在两端;
- OneToOneField: 一对一, 将字段定义在任意一端;
-
用一访问多
-
格式
对象.模型类小写_set
-
示例
grade.student_set
-
-
访问ID
-
格式
.对象.属性_id
-
示例
.student.grade_id
-
创建模型类
元选项
在模型类中定义meta类, 用于设置元信息
db_table: 定义数据库表名,推荐使用小写字母; 如不写, 数据表名默认为项目名小写_类名;
ordering: 对象的数据表的默认排序方式, 获取对象的列表时可使用.
例:
class Meta:
db.table = "students"
ordering = ['id'] # 升序 若需要降序,["-id"]
注意: 排序会增加数据库的开销
模型成员
类属性
-
objects
是manager类型的一个对象,作用是与数据库进行交互;
-
当定义模型类没有指定管理器时, Django会为模型创建一个名为objects的管理器;
class Student(models.Model): # 自定义模型管理器 # 当自定义模型管理器后, objects就不存在了 stuObj = models.Manager()
-
自定义管理器manager类
模型可以有多个管理器
作用:
向管理器类中添加额外的方法;
管理器返回的原始查询集合: 重写get.query()方法;
示例:
class StudentManager(models.Manager): def get_queryset(self): return super(StudentManager,self).get_queryset().filter(isDelete=False)
创建对象
-
目的:
向数据库中添加数据;
-
当创建对象时, django不会对数据库进行读写操作, 当调用save()方法时,才与数据库进行交互, 将对象保存到数据库中;
-
注意
“init”方法已经在父类Models.Model使用, 在自定义的模型中无法使用;
-
方法
-
在模型类中增加一个类方法
-
在定义管理器中添加一个方法
-