Django之ORM框架
一、定义
- 把类和数据表进行映射
- 通过类和对象就能操作它所对应表格中的数据(CRUD)
二、数据迁移
1.配置数据库连接信息
- 创建数据库和用户
CREATE DATABASE my_django charset=utf8; GRANT ALL PRIVILEGES ON *.* TO 'admin'@'%' IDENTIFIED BY '123456'; flush privileges;
- 配置数据库
需要在全局settings.py中的DATABASES字段中配置数据库信息
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'my_django', 'HOST': 'localhost', 'PORT': 3306, 'USER': 'admin', 'PASSWORD': '123456' } }
- 安装mysqlclient
- 需要满足的依赖
# Debian/Ubuntu sudo apt-get install python-dev default-libmysqlclient-dev # Red Hat/CentOS sudo yum install python-devel mysql-devel # macOS (HomeBrew) brew install mysql-client
pip install mysqlclient
2.在models.py中定义模型类
- 可以在子应用projects/models.py文件中定义数据模型
- 一个数据模型类对应一个数据表
- 数据模型类,需要继承Model父类或者Model子类
- 在数据模型中,添加的类属性(Field对象)来对应数据表中的字段
from django.db import models class Projects(models.Model): name = models.CharField(max_length=200) age = models.CharField(max_length=50)
3.迁移
# 生成迁移脚本 python manage.py makemigrations # 生成数据表 python manage.py migrate
执行以上两条命令过程如下:
然后进入刷新数据库后,可以看到有对应的表已经成功创建:
再看看刚刚创建的表结构:
当然上面生成迁移脚本和创建数据库表的命令行都是针对所有的,如果只想创建某一个子应用的表呢?只需要在上面的命令行后面跟上子应用名即可
# 生成指定应用的迁移脚本 python manage.py makemigrations 子应用名称 # 生成指定应用的数据表 python manage.py migrate
子应用名称
执行指定的迁移脚本还有另一种命令行,迁移脚本要先生成出来才能生效,生成的迁移脚本会存放在子应用目录下的migrations下
python manage.py sqlmigrate 子应用名称 迁移脚本
3.表的创建
在第二步的迁移步骤中,已经实现了如何通过数据模型创建数据库表,我们知道数据库表字段有各种属性,如长度、字符类型、约束条件、默认值等等,在Django的数据模型中,我们并不需要去编写sql语句来创建数据库表,而是可以通过类和对象的方式进行数据库的增删改查等操作,这样就方便了许多。
AutoField类、CharField类、IntegerField类、TextField类、DecimalField类、DateTimeField类、DateField类、TimeField类等等,它们都继承了Field父类,我们通过查看Field源码的构造方法,可以看到很多关于字段的属性设置
这里拿出常用的属性进行说明:
- verbose_name:个性化信息
- primary_key:主键约束,如果某一个字段中设置了primary_key=True,那么Django就不会自动创建id字段
- max_length:至少要指定一个该字段,它代表此字段的最大长度,不能为负数,最大长度不能超过200
- unique:唯一键约束
- blank:指定前端用户在创建数据时,是否需要传递,默认需要传递,如果不传递,设置为True
- null:指定数据在保存时是否可以为空,默认不能为空,为空设置为True
- default:指定默认值,往往会跟black一起使用
- help_text:帮助文本信息,在api接口文档平台和admin后端站点中会用于提示,往往跟verbose_name一致
而DateTimeField类、TimeField类也继承了DateField类,DateField类中的构造方法也有新的参数
其中:
- auto_now:设置成True后,Django会自动添加更新记录时的时间
- auto_now_add:设置成True后,Django会自动添加创建记录时的时间
我们开始通过数据模型自定义一些字段:
from django.db import models class Projects(models.Model): id = models.AutoField(primary_key=True) name = models.CharField(max_length=200, verbose_name="项目名称", help_text='项目名称', unique=True) leader = models.CharField(max_length=50) programmer = models.CharField(max_length=50, verbose_name="开发人员", help_text="开发人员") tester = models.CharField(max_length=50, verbose_name="测试人员", help_text="测试人员") desc = models.TextField(verbose_name='项目简介', help_text="项目简介", blank=True, default="XXXX", null=True) create_time = models.DateTimeField(auto_now_add=True, verbose_name="创建时间", help_text="创建时间") update_time = models.DateTimeField(auto_now=True, verbose_name="更新时间", help_text="更新时间")
同样进行数据迁移,得到的结果:
3.修改表名
按照上面的操作生成的数据库表的表名默认为:子应用名称_模型类名小写,如果想自定义表名,只需要在数据模型类下面定义一个Meta的子类
from django.db import models class Projects(models.Model): id = models.AutoField(primary_key=True) name = models.CharField(max_length=200, verbose_name="项目名称", help_text='项目名称', unique=True) leader = models.CharField(max_length=50) programmer = models.CharField(max_length=50, verbose_name="开发人员", help_text="开发人员") tester = models.CharField(max_length=50, verbose_name="测试人员", help_text="测试人员") desc = models.TextField(verbose_name='项目简介', help_text="项目简介", blank=True, default="XXXX", null=True) create_time = models.DateTimeField(auto_now_add=True, verbose_name="创建时间", help_text="创建时间") update_time = models.DateTimeField(auto_now=True, verbose_name="更新时间", help_text="更新时间") class Meta: # Meta子类的类名固定,可以使用db_table类属性来指定表名,使用verbose_name类属性指定表的个性化描述 db_table = 'tb_projects' verbose_name = '项目表'
删除原来的表之后重新迁移,数据库中刷新后,可以看到已经变更为自定义的表名了
三、CRUD
在CRUD操作之前,为了更好的debug,我们可以引入connection模块,它可以在我们进行CRUD操作时,会显示出对应的sql语句,通过sql语句,可以及时发现错误,也可以看到sql语句的性能是否达到最优
在视图模块中引入connection模块:
from django.db import connection
调试器上添加“connetion.queries”:
1.c(create)
向数据表添加一条记录,两种方法
1.使用模型类对象来创建
2.使用查询集的create方法
2.r(retrieve)
- 获取一个数据表的所有记录
- 返回所有记录组成的模型对象集合(queryset查询级)
- 获取指定记录
- get
- filter
- exclude
查询操作通过在视图方法中使用创建数据模型对象的方式,去调用它的get/filter/exclude方法
get:(1)一般只能使用主键或者唯一键作为查询条件;(2)如果查询的记录为空或者多条记录,会抛出异常;(3)返回的模型类对象,会自动提交
filter:通过过滤的方式查询,每个字段都提供了很丰富的选项进行查询操作
exclude:与filter相反,为反向过滤
先提前在数据库创建几条数据:
1.get方法
2.filter方法
3.exclude方法
3.u(update)
1.先获取模型类对象,然后修改某些字段,再调用save方法保存
2.可以使用模型类名.objects.filter().update()
显然第二种更好,sql语句性能优越
4.d(delete)
1.获取模型类对象,然后删除
2.可以使用模型类名.objects.filter().delete()
-------------------------------------------
个性签名:不忘初心,方得始终!
如果觉得这篇文章对你有小小的帮助的话,记得在右下角点个“推荐”哦,博主在此感谢!