@TOC
前言
我们在Django快速入门的三个章节简单的体验了一下Django的使用,当然只是使用到了其中的小部分功能,但是我们没有必要再入门demo中平铺没有重点的学习过多的知识点,接下来我们会针对某个模块进行详细系统的学习,当前章节主要讨论模型。
思考:
在我们快速入门的demo中有没有涉及到MTV的设计模式。
模型层定义
我们这里说的模型其实就是MTV中的M,模型的功能是描述数据,存储数据的字段与行为,说白了模型就是一个有对应数据库表的类。
模型层是一种抽象概念,包含对各个模型对象的相关操作。在模型层级Django提供给开发者的功能主要有两个:1根据Model对象构建数据表。2自动生成操纵数据API。
模型(Model类)的定义
根据设计的表结构在models.py文件中定义继承于django.db.models.Model的类,类的字段对应数据库表字段,类型也要对应,比如mysql中varcahr字段对应代码中需要使用CharField定义。
from django.db import models
# Create your models here.
# 根据表结构创建模型,定义类继承于models.Model
from django.utils import timezone
class news(models.Model):
# 每一个属性对应数据库表的一个字段
# 因为title在数据库表中是以字符形式存在,对应实体类指定为CharField,max_length表示最大长度
title = models.CharField(max_length=50)
content = models.CharField(max_length=200)
# 发表时间,时间类型,指定默认值为当前时间,注意timezone的包
pub_date = models.DateTimeField("保存日期",default = timezone.now)
#
def __str__(self):
return self.title + "," + self.content + "," + self.pub_date.strftime("%Y-%m-%d")
主键的设定
默认Django会自动在每一个Model类的基础上新增一个自增的数字字段作为主键:
#这是Django自己新增的,不需要我们手动书写一下代码
id = models.AutoField(primary_key=True)
我们可以取消这个功能,自行手动指定主键,只需要为自己的主键字段指定primary_key=True即可,这样Django就不再自动新增主键。
class(models.Model):
#创建stu_id为主键自动递增的数字主键
stu_id=models.AutoField(primary_key=True)
....
某些时候我们并不想使用自增的数字,而是UUID,Django也为我们提供好了自动生成并插入uuid的功能:
class(models.Model):
#创建stu_id为主键自动递增的数字主键
#参数分别为:指定当前属性对应的字段为主键,,,一定要指定默认值
stu_id=models.UUIDField(primary_key=True, default=uuid.uuid4)
....
模型字段
模型中的属性名称
定义字段名时应避免使用关键字,比如数据库中的关键字:desc,select,where等,还有 模型 API 冲突的名称, 如 clean, save, delete 等.
模型中的字段类型
定义数据就是声明字段。要根据实际情况选择字段的类型,字段类型主要还有以下功能:
1Django根据类中指定的字段类型创建表中的字段
2具有基本的数据校验功能
常用字段类型一览:
类型 | 功能 |
---|---|
AutoField | 根据可用ID自动递增,本质是IntegerField |
BigAutoField | 一个64位整数,与AutoField类似,不同之处在于它可存储的范围更广,占用空间大 |
BigIntegerField | 一个64位整数 |
BinaryField | 可存储二进制数据。比如保存转成二进制的文件,不推荐使用 |
BooleanField | 真/假字段 |
CharField | 字符串字段,用于小到大的字符串,有一个必要属性max_length |
TextField | 超大文本,比如保存小说 |
DateField | 日期 |
DateTimeField | 日期和时间 |
DecimalField | 一个固定精度的十进制数,Decimal在mysql本质是字符串,一般要求精度的小数需要此类型 |
EmailField | 同CharField,会检查该值是使用一个有效的电子邮件地址 |
FileField | 文件上传字段,保存了文件保存的路径等信息 |
ImageField | 同FileField,保存图片保存路径与图片信息,比如宽高 |
UUIDField | 同CharField,用于存储通用唯一标识符的字段 |
IntegerField | 一个整数。-2147483648到2147483647。 |
FloatField | 浮点数 |
... | ... |
还有几个与表关系有关的字段类型,我们在表关系中详细介绍。
字段参数
在定义字段的时候除了要考虑类型以外还需要注意参数,比如CharField的max_length参数表示指定字符串最大长度。
class news(models.Model):
#小括号中就是为字段指定的字段参数
name =models.CharField(max_length=20)
常用通用参数一览:
参数 | 功能 |
---|---|
null | 如果设置为 True,当该字段为空时,Django 会将数据库中该字段设置为 NULL。默认为 False 。数据库层面。 |
blank | 如果设置为 True,该字段允许为空。默认为 False。涉及表单验证方面 |
default | 指定默认值 |
primary_key | 如果设置为 True ,将该字段设置为该模型的主键。 |
unique | 如果设置为 True,这个字段的值必须在整个表中保持唯一 |
verbose_name | 字段备注名 |
editable | 如果False,该字段将不会显示在管理员或任何其他字段中 ModelForm。在模型验证期间也会跳过它们。默认是True |
db_column | 用于此字段的数据库列的名称。如果没有给出,Django将使用该字段的名称。 |
db_index | 如果True,将为此字段创建数据库索引。 |
choices | 一系列二元组,用作此字段的选项 |
我们这里演示以下choices参数的使用:
choice这个属性,用来限制用户做出选择的范围。比如说性别的选择(男或女),需要先提供一个二维的二元元组,第一个元素表示存在数据库内真实的值(m或f),第二个表示页面上显示的具体内容(男或女)。
#伪代码
class person(models.Model):
choice = (
('m', '男'),
('f', '女')
)
gender= models.CharField(max_length=1, choices=choice)
#创建一个person实例
p = person('m')
#保存到数据库
p.save()
#对象将具有get_FOO_display()方法获取二元组中相对应的第二个值,其中FOO是字段的名称
#得到的结果是 "男"
p.get_sex_display();
Meta选项
在Model模型类的内部定义 Meta类 来给模型进行一定的配置,常用的比如排序选项,数据库表名自定义等。
举例:
from django.db import models
class men(models.Model):
age= models.IntegerField()
height=models.IntegerField()
#定义内部类Meta选项
class Meta:
#指定默认排序,前缀"-"表示降序,如果去除前缀表示升序,?表示随机排序
#这里也可以按照多个字段进行排序 ordering = ["-age",“height”]
ordering = ["-age"]
#默认表名格式是: 小写的应用名_模型名,我们可以通过db_table 自定义表名
db_table = "men"
多表操作
我们目前已经可以根据需求创建单表映射的模型类,实际开发中我们会有很多的表,并且表与表之间会有一定关系
多表操作我们也叫做表关系:
1一对一
2多对一,一对多
3多对多
因篇幅原因,我们下一章节对多表操作进行详细介绍。