初识Django
初识Django Web框架
什么是Web框架
是一套组件(或者说是web开发中的一种工具),提供了通用的设计模式,能够很大程度的降低web开发的难度。
Django是什么
Django 是使用 Python 语言开发的一款免费而且开源的 Web 应用框架。由于 Python 语言的跨平台性,所以 Django 同样支持 Windows、Linux 和 Mac 系统。Django的设计目标就是为了使复杂的工作变得简单
Django的特点
相对于python其他的web框架,Django的功能是最完整的,Django定义了服务发布、路由发布、模板编程、数据处理的一套功能。
Django的主要特点:
- 集成
ORM
组件:Django 的 Model 层自带数据库 ORM 组件,为操作不同类型的数据库提供了统一的方式。 URL
映射技术:Django 使用正则表达式管理URL映射,因此给开发者带来了极高的灵活性。- 后台管理系统:开发者只需通过简单的几行配置和代码就可以实现完整的后台数据管理Web控制台。
设计模式
Django的遵循MTV
(Models,Templates,Views)的设计模式,而MTV是继MVC
(Models,Views,Cotroller)演化而来
MVC设计模式
MVC模式是Web设计模式的经典之作,具体分为以下三个部分
-
M(Model):表示数据存储层,对数据表的定义和数据的增删改查。
-
V(View):代表视图层,是系统前端显示部分,负责显示什么和如何进行显示。
-
C(Controller):代表控制层,根据从View层输入的指令来检索Model层的数据,并在该层编写代码产生结果并输出。
MVC设计模式示意图:
MVC 设计模式的请求与响应过程描述如下:
-
用户通过浏览器向服务器发起 request 请求,Controller 层接受请求后,同时向 Model 层和 View 发送指令;
-
Mole 层根据指令与数据库交互并选择相应业务数据,然后将数据发送给 Controller 层;
-
View 层接收到 Controller 的指令后,加载用户请求的页面,并将此页面发送给 Controller 层;
-
Controller 层接收到 Model 层和 View 层的数据后,将它们组织成响应格式发送给浏览器,浏览器通过解析后把页面展示出来。
MVC 的 3 层之间紧密相连,但又相互独立,每一层的修改都不会影响其它层,每一层都提供了各自独立的接口供其它层调用,MVC 的设计模式降低了代码之间的耦合性(即关联性),增加了模块的可重用性,这就是 MVC 的设计模式。
Django的MTV设计模式
Django 借鉴了经典的 MVC 模式,它也将交互的过程分为了 3 个层次,也就是 MTV 设计模式;
-
Model:数据存储层,处理所有数据相关的业务,和数据库进行交互,并提供数据的增删改查;
-
Template:模板层(也叫表现层)具体来处理页面的显示;
-
View:业务逻辑层,处理具体的业务逻辑,它的作用是连通Model 层和 Template 。
MTV设计模式示意图:
MTV 设计模式的请求与响应过程描述如下:
-
用户通过浏览器对服务器发起 request 请求,服务器接收请求后,通过 View 的业务逻辑层进行分析,同时向 Model 层和 Template 层发送指令;
-
Modle 层与数据库进行交互,将数据返回给 View 层;
-
Template 层接收到指令后,调用相应的模板,并返回给 View 层;
-
View 层接收到模板与数据后,首先对模板进行渲染(即将相应的数据赋值给模板),然后组织成响应格式返回给浏览器,浏览器进行解析后并最终呈现给用户。
Django中的ORM模块
什么是ORM
Django框架集成了众多的功能模块,我们在使用的时候省去了重复“造轮子”的过程,可以直接调用这些提供的模块,大大提高了开发效率。
所谓ORM
(Object Realtional Mapping)即对象关系映射,是一种基于关系型数据库的程序技术。ORM允许使用类和对象的方式对数据库中的数据进行操作,而不用再用传统的SQL语句去控制操作数据库,底层主要是通过映射机制实现的。
由于每种数据库的操作方式不一样,Django中的ORM提供了操作这些数据库的统一方法,ORM适配了多种常用的关系型数据库,如: PostgreSQL、MySQL、Oracle、Sqlite3 等。
ORM与数据库映射关系图:
ORM将类映射成数据库中的表,将一个实例对象映射成数据库中的数据行,将类的属性映射成数据库表中的字段,通过对象的操作,对应到数据库表的操作,实现了对象到SQL,SQL到对象的过程。
表模型
Django把表模型定义为Model
,它需要继承自django.db.models中的Model类,只要是数据库表相关的操作,都要集成该类,同时针对数据库的CRUD(增查改删),提供了一些简单的API,例如F查询
,Q查询
。
针对数据库表中的字段类型,Django中都有对应的类来对应,常用的包括以下几种类型:
字段 | 说明 | 字段属性 |
---|---|---|
AutoFiled | 默然自增主键(Primary_key=Ture),Django 默认建立id字段为主键。 | |
CharFiled | 字符类型 | Max_length=32,字符长度需要明确 |
IntgerFiled | 整型 int | |
DateFiled | 年月日时间类型 | auto_now=True,数据被更新就会更新时间 ;auto_now_add=True,数据第一次参数时产生。 |
DateTimeFiled | 年月日小时分钟秒时间类型 | auto_now=True,数据被更新就会更新时间; auto_now_add=True,数据第一次参数时产生。 |
DecimalFiled | 混合精度的小数类型 | max_digits=3,限定数字的最大位数(包含小数位);decimal_places=2,限制小数的最大位数。 |
BooleanFiled | 布尔字段,对应数据库 tinyint 类型数据长度只有1位。 | 值为True或False |
TextFiled | 用于大文本 |
针对这些字段类型,也有相关的一些参数介绍,如下表:
ID | 参数 | 参数介绍 |
---|---|---|
1 | null=True | 字段可为空 |
2 | blank=True | Admin后台中添加数据时是否可允许空值 |
3 | primary_key = False | 主键,对AutoField设置主键后,就会代替原来的自增 id 列 |
4 | auto_now 和 auto_now_add | # auto_now 自动创建---无论添加或修改都是当前修执行动作时间 # auto_now_add 自动创建---永远是创建时的时间 |
5 | choices | # 创建关联选项 GENDER_CHOICE = ( ('M', 'Male'),('F', 'Female'),) gender = models.CharField(max_length=2,choices = GENDER_CHOICE) |
6 | max_length | 字段最大长度 |
7 | default | 字段默认值 |
8 | verbose_name | 后台中字段的显示名称("注释") |
9 | name或db_column | 数据库中的字段名称 |
10 | unique=True | 不允许重复值出现 |
11 | db_index = True | 数据库索引 |
12 | editable=True | Admin后台中中是否可编辑 |
13 | error_messages=None | 错误提示 GENDER_CHOICE = ( (u'M', u'Male'),(u'F', u'Female'),) gender=models.CharField(max_length=2,choices=GENDER_CHOICE, error_messages={"错误类型":"错误原因"}) |
14 | auto_created=False | 自动创建 |
15 | help_text | Admin后台中提示帮助信息 |
16 | validators=[] | 提示区间,例如电话号码范围 |
Django定义数据表
在定义数据表之前,要先了解一个概念,什么是模型类。
模型类
模型类本质上属于一个python类,只是在Django中被称为模型类,是有django.db.models.Model派生出的子类,在Django中,模型类是数据交互的接口,一个模型类对应数据库中的一张表,模型类中的每一条类属性对应数据库表中的一个字段。因此,我们可以理解为,Django中模型类就相当于ORM模块。
定义模型类
博客表,有标题、正文、创建时间、更新时间等四个字段,定义如下
from django.db import models
from django.utils import timezone
# Create your models here.
'''
利用ORM创建表时,Django会默认创建id字段,自增,默认为主键
'''
# 博客文章Article表
class Article(models.Model):
# 博客标题
title = models.CharField(max_length=100) # 字段类型为char,max_length为100
# 博客正文
body = models.TextField() # 字段类型为TextField
# 创建时间
create_time=models.DateTimeField(default=timezone) # 字段类型为DateTime
# 更新时间
update_time = models.DateTimeField(auto_now=True) # 字段类型为DateTime
def __str__(self): # 类的魔法方法
return self.title
ORM管理器对象
什么是管理器对象
定义完模型类即创建完数据库表后,可以利用ORM中类和对象的方式来对表进行操作
插入一条数据
Article.objects.create(title="Django入门",body="关于Django的使用和相关介绍")
'''
插入一条标题是“Django入门”,正文是“关于Django的使用和相关介绍”的数据
'''
object是做什么的?
每个继承django.db.model.Model的模型类,都会有一个objects对象被同时继承下来,而这个对象,在ORM中被叫做管理器对象
,针对数据库的增删改查可以用objects管理器对象
来实现
利用ORM插入数据有两种方式,上面的也是常用的一种,另外一种如下
Obj = Article(title="Django入门",body="关于Django的使用和相关介绍") # 实例化对象
Obj.title="创建第一个Django项目" # 给title赋值
Obj.save() # 调用save方法保存
常用的增删改查操作:
Article.objects.all() # 查询表中所有的数据--> select * from Article
Article.objects.filter(id=1) # 查询表中id为1的数据-->select * from Article where id=1
Article.objects.get(id=2) # 获取表中id为2的数据,该方法有且只有一个查询结果,多或者少于一个都会抛出异常-->select * from Articel where id=2
Article.objects.get(id=2).delete() # 删除id为2的一条记录 -->delete from Article where id=2
Articel.objects.get(id=2).update(title="Django入门") # 将id为2的数据里title字段对应的数据修改为“Django入门”-->update Article set title="Django入门" where id=2
ORM的优势与劣势
- ORM的优势
1. 使用ORM模块,只需要面向对象编程,不需要再写原生SQL语句(但是还是要会写,知道原理)。
2. 实现数据模型与数据库的解耦,不再去关心不同数据库之间操作上的差异,通过简单的更改配置就可以实现数据库的更换,而无需更改代码
-
ORM的劣势
相比于直接用SQL语句来说,使用ORM操作数据库中间会经历
对象的操作
到SQL
语句的转换,再根据查询结果
转换成对象
,所以在映射的过程中存在性能的丢失,但是相对而言,这点性能损失是微不足道的。
总的来说,ORM模块的使用,大大的给开发者提供了便捷,所以其他语言开发的框架,对ORM也有很多应用,比如Hibernate
、IBATIS
、EclipseLink
等。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 提示词工程——AI应用必不可少的技术
· 地球OL攻略 —— 某应届生求职总结
· 字符编码:从基础到乱码解决
· SpringCloud带你走进微服务的世界