Django对很多数据库都有支持,为这些数据库提供了统一的调用API。可以根据不同的业务需求,选择配置不同的数据库。本篇文章主要介绍ORM和模型属性。
ORM
ORM全称Object Relational Mapping,即对象关系映射,是在pymysq之上又进行了一层封装,对于数据的操作,我们无需再去编写原生sql,代之的是基于面向对象的思想去编写类、对象、调用相应的方法等,ORM会将其转换/映射成原生SQL然后交给pymysql执行。
优点
根据对象类型生成表结构;将对象、列表操作转换为sql语句;将sql语句查询的结构转换为对象、列表。能够极大地减轻了开发人员的工作量。
图解
定义属性
Django根据属性的类型确定以下信息:
1.当前选择的数据库支持字段的类型
2.渲染管理表单时使用的默认html控件
3.在管理站点最低限度的验证
模型、属性、表、字段关系
一个模型类在数据库中对应一张表,在类中定义的属性,对应模型对照表中的一个字段。
主键列
Django会为表增加自动递增的主键列,每个模型只能有一个主键列,如果设置某属性为主键列后,则django不会再生成默认的主键列
指定主键
id = models.AutoField(primary_key=True)
属性命名
遵循标识符规则,不能是python的保留关键字
由于django的查询方式,不允许使用连续的下划线
模型库
定义属性时,需要定义字段类型,字段类型被定义在django.db.models.
fields目录下,为了方便使用,被导入到django.db.models中。
使用方式
导入from django.db import models
通过models.field创建字段类型的对象,赋值给属性。
逻辑删除
对于重要数据都做逻辑删除,不做物理删除。
实现方法是定义isDelete属性,类型为booleanField,默认值为False。
字段类型
AutoField
一个根据实际ID自动正常的IntegerField,通常不指定。
如果不指定一个主键字段将自动添加到模型中
models.AutoField(primary_key=True)
CharField(max_length=字符长度)
字符串,默认的表单样式是TextInput
models.CharField(max_length=20)
TextField
大文本字段,一般超过4000使用,默认的表单控件是Textarea
models.TextField()
IntegerField 整数
models.IntegerField()
DecimalFiled(max_digits=None, decimal_places=None)
使用python的decimal实例标识的十进制浮点数
参数说明
DecimalField.max_digits:位数总数,例如123.45就是5位
DecimalField.decimal_places:小数点后的数字位数
models.DecimalField(max_digits=5, decimal_places=2)
FloatField
用python的float实例来表示的浮点数
models.FloatField()
BooleanField
True/False 字段,此字段的默认表单控制是checkboxInput
models.BooleanField()
NullBooleanField
支持使用null/true/false三重值
models.NullBooleanField()
DateField([auto_now=False, auto_now_add=Fasle])
使用python的datetime.date实例表示的日期
models.DateField()
参数说明
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
models.TimeField()
DateTimeField
使用python的datetime
Datetime实例表示的日期和时间,参数同DateField
models.DateTimeField()
FileField
一个上传文件的字段
该字段不允许使用primary_Key属性。包含两个可选参数:FileField.upload_to和FileField.storage。FileField.upload_to表示文件上传后的保存位置。
ImageField
继承FileField字段的全部属性与方法,但是仅允许上传图片类型文件。
为了设置图片显示的高度与宽度,ImageField字段额外提供了两个属性:
ImageField.height_field,图片高度。
ImageField.width_field,图片宽度。
字段选项
通过字段选项,可以实现对字段的约束;在设置字段对象时通过关键字参数指定。
null
如果为True,django将控制以null存储到数据库中,默认值是False
blank
如果为True,则该字段允许为空,默认值是Fasle
注意:与Field.null属性不同的是,null只是表示数据库值是空的,而blank用于表单验证。当字段属性blank=True时,表单验证将允许字段值为空,但是,当blank=False时,表单字段将变成必填字段。
db_column
字段的名称,如果未指定,则使用属性的名称
db_index
若值为True,则在表中会为此字段创建索引
default
默认值
primary_Key
若为True,则该字段会成为模型的主键字段
unique
如果为True,这个字段在表中必须有唯一性
choices
属性值为一个可迭代对象,如列表或者元组,迭代对象的每个成员包括两个元素。当字段设置choices属性时,字段在网页中将会以下拉列表的形式显示。列表或元组的第一个值将作为字段值保存到数据库中,第二个值用于提高字段的可读性。
示例:
Student_Hobby_Choice = [
('足球', '踢足球看足球比赛'),
('篮球', '踢篮球看篮球比赛'),
('羽毛球', '踢羽毛球看羽毛球比赛'),
]
hobby = models.CharField(max_length=20,
choices=Student_Hobby_Choice, default='足球')
效果如下:
help_text
额外的“帮助”文本,随表单控件一同显示,在文本中可以使用HTML标记。
示例:
desc = models.CharField(max_length=20,
help_text="可填写该学生的<em> 自我描述或评价 </em>")
效果如下:
表与表之间关系
分类
Foreignkey:一对多,将字段定义在多的端中
ManyToManyField:多对多,将字段定义在关系表模型中
OneToOneField:一对一,将字段定义在任意一端中
用一访问多
格式:对象.模型类消息_set
示例:Grades.students_set
访问id
格式:对象.属性_id
示例:Students.grade_id
定义模型
myapp/models.py
from django.db import models
class Grades(models.Model):
""" 班级表模型 """
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=20)
boy_num = models.IntegerField()
girl_num = models.IntegerField()
create_time = models.DateTimeField()
class Students(models.Model):
""" 学生表模型 """
name = models.CharField(max_length=20)
gender = models.BooleanField(default=True)
age = models.IntegerField()
desc = models.CharField(max_length=20)
isDel = models.BooleanField(default=False)
# 设置与班级表关联外键 一对多外键设置在多的模型中
# CASCADE 级联操作
grades = models.ForeignKey("Grades", on_delete=models.CASCADE)
元属性
元属性是“模型中任意非模型字段的内容”,例如排序功能、数据表名、人类可读的名字(单数形式和复数形式),所有元属性都是可选的。通过在模型中添加一个叫作Meta的子类。
db_table 定义数据表名称,推荐使用小写字母。
如果不写数据表明默认为项目名小写_类名小写
ordering 对象的排序字段,获取对象的列表时使用
ordering['id'] 升序
ordering['-id'] 降序,默认降序
注意:排序会增加数据库的开销
class Students(models.Model):
""" 学生表模型 """
class Meta:
# 表名称
db_table = 'myapp_students'
# 排序
ordering = ['-id', 'gender']
Indexes用来定义数据库索引,形式如下:
indexes = [
models.Index(fields=['name', 'age']),
models.Index(fields=['name'], name='name')
]
表迁移
新增表字段或者表结构变化,需要进行表迁移。
生成表迁移文件
python manage.py makemigrations
执行表迁移
python manage.py migrate