在这里肯定有小伙伴会说,前面不是已经引用了模型层了吗?并且在模型层中完成了数据库的操作了呀,为什么还要讲模型层?
首先呢,前面属于我们最传统的处理方式,那种方式过于麻烦,无法很好处理数据。模型层真正应该要应用的是ORM,那么ORM是什么呢?
ORM概述
对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。
简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系数据库中。
ORM作用
ORM在业务逻辑层和数据库层之间充当了桥梁的作用。
ORM优点
不用直接编写sql语句,只需要操作对象一样从数据库中操作数据,那么开发人员只需要考虑业务逻辑的处理,从而提高了开发效率。
ORM缺点
在一定程度上会牺牲程序的执行效率以及sql语句技能的退化
Django中ORM的使用
Django项目使用MySQL数据库
-
在Django项目的settings.py文件中,配置数据库连接信息:
注意:mysql数据库在模型层中是不能够自动创建对应的数据库哦,所以此处必须手动在mysql服务器上手动创建一个数据库名叫:mydatabase,不然的话后面实现数据迁移和同步的时候会提示无法找到对应的数据库哦
2.在模型层中即models.py文件中声明类,该类对应数据库的表,具体实现如下:
from django.db import models
#创建一个用户信息表
#如果你需要将当前类映射到指定数据库完成对应表结构的创建的话,那么当前类必须继承models.Modle,否则的无法生成迁移文,那么就无法实现数据同步操作
#就相当于是一个普通类
class CustomerInfo(models.Model):
#声明客户类型的选择:
customer_chocie=[("A","A类客户"),("B","B类客户"),("C","C类客户")]
#例如:将数据导出到execl等文件中,首行都是每列的描述verbose_name;如果不想自动让django默认添加一个id的字段,那么可以自定义id,并将该id的值
# 设置为主键,那么默认的就不存在,如果不想自定义id的话也不想要自动生成的那个id,那么在当前表中指定一个字段为主键
#customer_name就是一个主键
customer_name=models.CharField(max_length=12,name="cus_name",verbose_name="客户名称",primary_key=True)
customer_type=models.CharField(max_length=2,choices=customer_chocie,name="cus_type")
#如果是使用integerField的话则不需要声明其长度
customer_phone=models.IntegerField()
customer_email=models.CharField(max_length=20)
customer_address=models.CharField(max_length=100,null=True)
3.定义了modle模型层内容后,则需要实现生成数据迁移文件操作;
使用命令:
python manage.py makemigrations apps的名字
-
注意:a.创建好的apps必须要添加到settings中的INSTALLED_APPS
如果不进行配置的话,则会提示无法找到对应的apps。
b.需要安装mysqlclient第三方包,否则提示mysqldb的error错误;
c.最新的django3.0版本无法兼容mysql5.5,需要升级mysql版本或者降级django版本。
其中mysql5.5与mysql最新版本8.0想要同时共存的话,详细操作可以看之前推送的文章
4.完成数据迁移以及同步数据的操作,使用下面命令:
python manage.py migrate apps的名字
上面操作完毕后,会在mysql指定配置的数据库中创建所设定模型层的表结构,如下图:
Django模型层应用
上面已经完成了表结构的创建,如果我要对该表完成数据的插入、修改、删除等操作的话,则如何实现?
首先操作模型层有两种方式:
-
通过django的请求响应的形式完成数据的操作
from django.http import HttpResponse
from AddCustomer.models import CustomerInfo
def add_customer(request):
#从页面上获取的数据,传入的参数
get_info={
"cus_name":request.GET.get("customer_name"),
"cus_type":request.GET.get("customer_type"),
"customer_phone":request.GET.get("customer_phone"),
"customer_email":request.GET.get("customer_email"),
"customer_address":request.GET.get("customer_address")
}
#前面可以实现一个一个赋值操作
customer=CustomerInfo.ob