介绍ORM
对象关系映射(Object Relational Mapping,简称ORM)是通过使用描述对象和数据库之间映射的元数据,将面向对象语言程序中的对象自动持久化到关系数据库中。
Django中的ORM简单说就是你调用相应的方法,Django框架会自动帮你转换成原生SQL进行执行。
经过ORM转换的SQL语句虽然有一定的性能损坏,不过Django将方法转换成SQL语句时也会尽力去优化语句,另一方面当今计算机的性能越来越强大的今天,转换的性能损坏对于大多数服务器来说已经可以忽略不计了。
但ORM模型所带来的的优势却日益突出,特别是代码的可读性和代码维护上。项目越大越能体现出ORM的优越性。
连接MySQL数据库
使用djangoORM连接MySQL数据库我们需要安装mysqlclient
这个模块,如果你在安装的时候报错,提示c++库未安装可以尝试从浏览器中下载mysqlclient库并离线安装。下载地址
如果安装失败,就先升级一下pip(一定要保证pip在最新状态)可以使用清华源升级pippip install --upgrade -i https://pypi.tuna.tsinghua.edu.cn/simple pip
配置文件
下载完mysqlclient我们需要在配置文件(settings.py)中进行配置
在DATABASES中添加信息(这里大小写敏感,配置名必须大写)
DATABASES = {
'default': {
# 注明使用的数据库为MySQL
'ENGINE': 'django.db.backends.mysql',
# 使用的数据库表名
'NAME': 'django的ORM',
# 数据库登陆用户名
'USER': 'root',
# 数据库登陆密码
'PASSWORD': 'root',
# 数据库登陆ip
'HOST': 'localhost',
# 数据库端口
'POST': '3306'
}
}
创建表
每个APP都会自带一个models. py
文件,这个文件就是APP给你预留用于创建表的文件。下列大致的创建流程。
- 在settings.py中,配置好DATABASES,做好数据库相关的配置。
- 以类的形式创建一个表,默认表名为APP名_类名,此类需要继承(models.Model)。其中进行Field属性创建不同属性的表头,或者创建外键等操作
- 生成迁移脚本文件(
python manage.py makemigrations
),迁移脚本文件会将每次数据库的变化记录在migrations文件夹中 - 最后将migrations变化的APP的模型映射进入数据库(
python manage.py migrate
)
可以在命令行启动映射命令,如果你是用pycharm,这可以使用下列方法
Field属性介绍
选择field类型的时候相当于我们在选择数据的存储类似
field类型众多,这么我们暂时先介绍一些比较常用的类型
field类型 | 作用 |
---|---|
AutoField() | 在数据库中为int 类型,映射到数据库中是int类型的主键,默认长度为11,有自增特性(Django的ORM创建表时如果没有主键会自动生成表头为此类型名称为id的主键)使用此字段必须传入primary_key=True |
BigAutoField() | 在数据库中为bigint 类型,用于长整数类型的主键,长度为20,有自增特性与AutoField不能共存。使用此字段必须传入primary_key=True ,用作为主键的还有个SmallAutoField() 和此方法类似 |
BooleanField() | 在数据库中为tinyint 类型,长度为1,在模型层面,此类型接收的是True或Flast,当没有指定默认值时默认为None |
CharField() | 在数据库中为varchar 类型,在模型中为字符串类型,此类型必须指定长度(max_length ) |
DateTimeField() | 在数据库中为datatime 类型,用于存储日期时间,因为Django中有时区概念,下方会详解此类型。 |
EmailField() | 在数据库中为varchar 类型,用于存储邮箱,默认长度为254,且不能为空(配合表单会检测邮箱合法性) |
FileField() | 在数据库中为varchar 类型,用于存储文件(存储的文件路径) |
ImageField() | 在数据库中为varchar 类型,用于存储图片(存储图标需要安装pip install Pillow ) |
FloatField() | 在数据库中为double 类型,浮点类型,用于存储浮点数 |
SmallIntegerField() | 在数据库中为smallint 类型,默认长度为6的短整数类型,值的区间在-32768, 32767 |
IntegetField() | 在数据库中为int 类型,默认长度为11的整数类型,值的区间在-2147483648, 2147483647 |
BigIntegerField() | 在数据库中为bigint 类型,默认长度为20的长整数类型,值的区间在-9223372036854775808, 9223372036854775807 |
PositiveSmallIntegerField() | 在数据库中为smallint 类型,默认长度为5的非负小整数,值的区间在0, 32767 |
PositiveIntegerField() | 在数据库中为int 类型,默认长度为10的非负整数,值的区间在0, 2147483647 |
TextField() | 在数据库中为longtext 类型,长整数类型,通常使用大量文本时才会使用此类型 |
UUIDField() | 在数据库中为char 类型,只能存储UUID格式字符串,(UUID为一个32位的全球唯一的字符串,一般用来作为主键) |
URLField() | 在数据库中为varchar 类型,用于存储URL格式字符串,默认长度为200。 |
Django日期类型详解
Django中日期为分时区日期,其中在setting.py中可以设置当前时区,默认为协调世界时(UTC),在中国我们大多使用TIME_ZONE = Asia/Shanghai
这个时区。
如果不想引入时区的概念可以将USE_TZ = True
设为Flast,即可关闭时区
Django建议大家使用from django.utils.timezone import now
保存当前时间
存储日期除了我上述介绍的方式外,还有DateField
与TimeField
,他们分别只能存储日期与时间,使用较少。
日期的field有两个特殊的属性,分别是
auto_now=True
自动创建—无论添加或修改,都是当前操作的时间auto_now_add=True
自动创建—永远是创建时的时间
Field属性中常用参数
常用参数 | 作用 |
---|---|
null | 是否允许为空(默认为False) |
db_column | 此字段在数据库中的名称(如果不设置此参数,默认名称为属性名) |
default | 默认值,可以是一个值,也可是一个函数 |
primary_key | 是否为主键,默认为Falst |
unique | 在表中此字段值是否唯一(手机号邮箱号等常用) |
max_length | 指定字段长度 |
模型中Meta配置
对于一些模型级别的配置。我们可以在模型中定义一个类,叫做Meta(此类必须放置在数据库模型中,也就是集成了models.Model的类中)。然后在这个类中添加一些类属性来控制模型的作用。
db_table
我们使用ORM创建的表名默认为APP名_类名
,如果我们不想使用此名称,可以在Meta类(class Meta)写入db_table指定名称
ordering
ordering用于指定读取数据时,数据的排序方式,比如ordering = ['id']
为id的升序,ordering = ['-id']
为id的降序
class People(models.Model):
id = models.AutoField(primary_key=True)
角色 = models.CharField(max_length=20)
介绍 = models.TextField()
当前时间 = models.DateTimeField()
class Meta:
db_table = '模型创建测试表'
ordering = ['id']