Django中ORM的使用
1.ORM的简介
对象关系映射(英语:Object Relational Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序设计技术,用于实现向对象编程语言里不同类型系统的数据之间的转换。从效果上说,它其实是创建了一个可在编程语言里使用的“虚拟对象数据库”。它能将类映射成一张表,写个类就相当于在创建一张表,创建个对象就相当于写一条记录,对象获取属性就相当于记录某个字段获取的值。
其实现的过程比如说当pymysql写的程序发出请求时,会先经过ORM请求数据库内相关的资源,ORM得到相应的资源后,会将数据封装成一个对象,然后用户通过点点点的简单操作方式就可以获取相应的数据。非常简单方便,但同时也有一个缺点,由于封装的程度过高,sql语句的效率过低,有时需要自己写sql语句。
2.使用ORM在MySQL中创建表
创建表一共分为两部分,一是书写类,二是执行数据库迁移命令。
第一步:打开应用下面的models.py 文件,在里面书写类,类的格式如下
from django.db import models
class User(models.Model):
id = models.AutoField(primary_key=True) # id int primary_key auto_increment
username = models.CharField(max_length=32) # username varchar(32)
password = models.IntegerField(verbose_name='密码')
注意事项:
- 每个类一定要继承 models.Model
- 由于一张表中必须要有一个主键字段,并且一般情况下都叫id字段,如果对主键名没有要求,可以不写id字段,因为ORM当你不定义主键字段的时候,会默认帮你创建一个名为id的主键字段,也就意味着,后续在创建模型表的时候如果主键字段名没有额外的叫法,那么主键字段可以省略不写
- 字段生成的方法,都采用 字段名=models.ORM中字段类型的名称(参数='……')格式实现,可以在括号里写想要的属性参数
- 对于CharField类型,必须要指定max_length参数和属性,否则会报错
- 对于每一个字段来说,都有verbose_name参数,它的作用是用于对字段的解释说明
第二步:执行数据库迁移命令,在pycharm的Terminal窗口内,执行以下两条命令。每次对models.py中关于数据库的内容进行修改时,必须要执行以下两步操作,不然对数据库的操作无法同步到数据库中。
python manage.py makemigrations # 将操作记录记录到migrations文件夹中
python manage.py migrate # 将对数据库的操作真正同步到数据库中
3.使用ORM实现字段的增删改
- 删:直接注释掉相应的字段,然后再执行两条数据库迁移的命令即可(注释的时候一定要小心,因为注释掉数据就没有了,虽然从数据库的层面来说可以恢复,但是依然要小心, 避免不必要的麻烦)
- 改:直接在相应的字段里进行修改,然后执行两条数据库迁移命令即可
- 增:增加字段有三种方法
- 增加字段后,执行数据库迁移命令时,在终端中给一个默认值
- 增加字段时,给字段添加可以为空的参数属性 null = True
- 增加字段时,给字段设定默认值 default = '默认值'
class User(models.Model):
id = models.AutoField(primary_key=True)
username = models.CharField(max_length=32, null=True)
# password = models.IntegerField(verbose_name='密码')
hobby = models.CharField(max_length=32, default='swimming')
4.使用ORM实现对数据的增删改查
- 数据查询
# 查询数据库中字段名为A,字段值为a的数据
res = models.表名.objects.filter(字段名A=字段值a)
#举例
res = models.User.objects.filter(username='jack')
# 等价于select * from user where username='jack'
print(res) # <QuerySet [<User:User object>]>
user_obj1 = res[0]
user_obj2 = res.first()
补充说明:
- <QuerySet [<User:User object>]> 可以看成列表套数据对象的格式,可支持索引取值(不支持负数索引),切片操作,但是不推荐使用索引取值,推荐使用res.first()方法取值。
- 当数据库中不存在想找的数据时,列表为空,所以可以根据查询结果res是否为真。
- filter里面可以携带多个参数,逗号隔开,参数与参数之间默认是and关系
- 数据增加
数据增加有两种办法
# 方法1
res = models.表名称.objects.create(字段名1='字段值',……) # 返回值就是当前被创建对象的本身
# 方法2
obj = models.表名称(字段名1='字段值', ……) # 先实例化一个对象
obj.save() # 保存数据
- 数据的编辑
# 方法1
models.表名称.objects.filter(字段名='字段值',……).update(待修改的字段1='新字段值',……,待修改的字段n='新字段值')
# 方法2
obj = models.User.objects.filter(字段名='字段值',……).first()
obj.字段名 = '新字段值'
obj.save()
补充说明:
- 方法1,将filter查询出来的列表中所有的对象全部更新, 批量更新,操作只修改被修改的字段
- 方法2,当字段特别多的时候效率会非常的低从头到尾将数据的所有字段全部更新一边 无论该字段是否被修改
- 数据的删除
models.表名称.objects.filter(字段名='字段值',……).delete()
5.使用ORM创建表关系
ORM创建表关系的方法是在models.py中,先将基表创建出来,然后再添加外键字段,即在相应的表下新增该表的外键字段。表关系创建的具体方式如下
表关系 | 创建的方法 |
---|---|
一对一 | 外键字段名 = models.OneToOneField(to='关联表名') |
一对多 | 外键字段名 = models.ForeignKey(to='关联表名') |
多对多 | 外键字段名 = models.ManyToManyField(to='关联表名') |
补充说明:
- 在Django 1.X版本中,外键字段是级联更新删除的,2.X和3.X不是,需要自己主动设置
- Django框架在用户实施数据库迁移动作后,会自动在一对一与一对多的外键字段名后面加上_id
- 多对多的关系的字段是虚拟字段。在Django框架中,无需用户自己另外创建多对多的关系表,当在类中写完多对多外键字段,实施数据库迁移命令后,ORM会帮用户自动创建一张外键字段表,无需用户自己创建,非常方便
- 在Django框架中创建表时,和在Mysql中创建表不同,没有先后顺序,一个个创完即可