基于Django的web开发(一)
微信关注公众号:夜寒信息
致力于为每一位用户免费提供更优质技术帮助与资源供给,感谢支持!
Django和Flask都是基于Python的优秀的开源web开发框架,这一阶段首先来学习Django这款重量级框架,以后会去学习Flask框架。
一、Django的安装及基本介绍
使用Django框架开发web项目建议使用Pycharm专业版,可以关注公众号“夜寒信息”一键获取安装教程,以下环境介绍都是基于Pycharm介绍。
一、文件的简单介绍
新建的web项目有许多文件夹和许多文件,其中的文件和文件夹我们会在之后一一介绍,在这里我只介绍现阶段需要认识的。
一打开项目我们会看到manage.py文件,这是我们一级目录下的文件,我们在运行web项目时便是运行这个文件。我们练习会在测试服务器上运行使用代码python manage.py runserver
这样便可以在本机访问web项目。
还有一个settings.py是二级目录文件,其中包含的是项目的设置。其中DEBUG设置为true则会在错误时显示错误信息,并且会在对文件进行更改时自动刷新服务器。INSTALLED_APP为Django安装的APP,可以使用django-admin startapp appname
或python manage.py startapp appname
创建个人应用,在写完自己的之后需要在这里注册添加。TEMPLATES为html模板文件的目录,可以手动新建templates文件夹,在这里注册添加即可。DATABASED为数据库,可以改为自己的数据库使用。STATIC_URL为静态文件的目录,即js,css,img等文件,可以手动创建static文件夹,在这里注册添加。
其中urls.py为url路由地址,使用正则表达式表示。
views.py为路由响应函数,对用户的操作进行响应。
二、路由的自定义
1、注册一个路由
- urls.py中
- url函数中自定义一个url,使用正则表达式作为匹配规则。
- 传入一个视图函数,对应的是views中的一个函数,传入函数名无括号
- 去views中实现视图函数
- 第一个参数是request
- 记得返回值为Response
2、模板配置
- 两种
- 1、在APP中进行模板配置
- 只需在APP的根目录中创建templates文件夹即可
- 2、在项目目录中进行模板配置
- 需要在项目目录中创建templates文件夹并标记
- 需要在settings中注册
3、路由优化配置
- 项目逻辑如果过于复杂,可以进行拆分
- 拆分为多个APP
- 继续拆分路由器urls
- 在APP中创建自己的urls
- 子路由使用根路由规则+子路由规则
二、Django中数据库的操作
Django的models使用了Models Relational Mapping 对象关系映射,将业务逻辑进行解耦合,不论是什么数据库,都是用Django的内部函数即可完成相关操作。
一、数据库的连接和表的创建
1、连接数据库
数据库的连接在settings.py中的DATABASES中修改参数,这里特别说明mysql数据库的连接
MySQL数据库连接有两步:
- 驱动
- 下载驱动pymysql
- 伪装驱动头,在__init__.py中加install_as_mysqldb()
- 参数
- USER
- PASSWORD
- HOST
- PORT
- NAME
- ENGINE
2、创建数据库表
创建数据库表需要在models.py文件中写相关的类,使用python manage.py makemigrations
命令形成迁移文件,然后再使用python manage.py migrate
命令进行迁移
下面举个例子:
class Student(models.Model):
s_name = models.CharField(max_length=18)
s_grade = models.ForeginKey(Grade)
这样便建立了一个表,其中CharFiled为字段类型,max_length为字段约束,在后面会有详细介绍
3、数据库的数据类型
- AutuField
- 一个根据实际ID自动增长的IntegerField,通常如果不指定,一个主键字段中将会自动添加到模板中
- Charfield(max_length=n)
- 字符串,默认的表单样式为TextField
- TextFiled
- 大文本字段,一般超过4000使用,控件为Textarea
- IntegerField
- 整数
- DecimalField(max_digits, decimal_palaces)
- 使用python的decimal实例次表示的十进制浮点数
- 参数说明
- max_digits 位数总数
- decimal_palaces 小数点后的数字位数
- FloatField
- 用python的float实例来表示的浮点数
- BooleanField
- true/false字段,默认控件为CheckboxInput
- NullBooleanField
- 支持null、true、false三种值
- DateField([auto_now=False, auto_now_add=False])
- 使用python的datetime、date表示的日期
- 参数说明
- auto_now 保存对象是,自动设置该字段为当前时间
- auto_now_add 保存的对象是,第一次创建时自动设置的时间
- TimeField
- 使用python的datetime.time表示时间
- DateTimeField
- 使用python的datetime.datetime表示的日期和时间
- FileField
- 一个上传文件的字段
- ImageField
- 继承了FileField,增加校验是否为image
4、字段选项
通过字段选项,可以实现对字段的约束
- null
- 如果为True,Django将空值以NULL存储到数据库中,默认是False
- blank
- 如果为True,则该字段允许为空白(空字符串""),默认是False
- db_column
- 指定字段的名称
- db_index
- 若为True则创建索引
- default
- 默认值
- primary_key
- 若为True,则字段设定为主键
- unique
- 若为True,该字段唯一
二、基本数据操作:
1、增删改查
- 存储
- save()
- 查询
- 查所有 objects.all()
- 查单个 objects.get(pk=xx)
- 更新
- 基于查询的
- 查好的对象,修改属性,然后save()
- 删除
- 基于查询的
- 调用delete()
2、模型过滤
- filter()
- 选中
- exclude()
- 剔除
- 都可连续使用
- 可以链式调用
- Peroson.filter().filter.xxx.exclude().exclude().yyy
- all()
- 获取所有数据,可切片
- order_by()
- 排序
- values()
- 一条数据就是一个字典,返回一个列表
- get()
- 获取一个数据,若未找到匹配项会产生DoesNotExist异常,若找到多个则产生MultiObjectsReturned异常
- first()
- 返回查询集中的第一个对象
- last()
- 返回查询集中的最后一个对象
- count()
- 返回查询集中的对象个数
- exists()
- 判断查询集中是否有数据,有则返回True
3、条件查询
规则:属性__运算符=值
- gt
- 大于
filter(sage__gt=30)
- 大于
- lt
- 小于
filter(sage__lt=30)
- 小于
- gte
- 大于等于
filter(sage__gte=30)
- 大于等于
- lte
- 小于等于
filter(sage__lte=30)
- 小于等于
- in
- 是否包含在范围内
filter(pk__in=[2,4,6])
- 是否包含在范围内
- contains
- 是否包含,大小写敏感,类似于like模糊查询
filter(sname__contains='王')
- 是否包含,大小写敏感,类似于like模糊查询
- startswith
- 以xx开始
filter(sname__startswith='王')
- 以xx开始
- endswith
- 以xx结束
filter(sname__endswith='王')
- 以xx结束
- exact
- 精确判断,大小写敏感
filter(isDelete=False)
- 精确判断,大小写敏感
- isnull
- 是否为空
filter(sname__isnull=False)
- 是否为空
4、聚合函数
使用aggregate返回聚合函数的值
- Avg
- 平均值
- Count
- 数量
- Max
- 最大值
- Min
- 最小值
- Sum
- 求和
举例:
Students.objects().aggregate(Max('sage'))
5、F对象
-
可以获取属性的值
- 举例:
grades = Grade.objects.filter(girlnum__gt=F('boynum'))
- 举例:
-
可以实现一个模型的不同属性的运算操作
-
还可以支持算术运算
- 举例:
grades = Grade.objects.filter(girlnum__gt=F('boynum')-10)
- 举例:
6、Q对象
过滤器的方法中的重要参数,常用于组合条件
- 可以对条件进行封装
grades = Grade.objects.filter(Q(girlnum__gt=5) & Q(boynum__gt=10))
- 封装之后可以支持逻辑运算
- 与 &
- 或 |
- 非 ~
7、模型成员
- 显性属性
- 开发者手动书写的属性
- 隐性属性
- 开发者未书写,ORM自动生成的
- 如果把隐性属性手动申明,系统便不会添加隐性属性
8、模型关系
- 1:1
- 应用场景
- 用于复杂表的拆分
- 扩展新功能
- OneToOneField
- 关系申明后有细微差别
- 实现
- 使用外键实现
- 对外键添加了唯一约束
- 数据删除
- 级联表同时删除
- 主表:从表数据删除,主表不受影响
- 从表:主表数据删除,从表数据直接删除
- PROTECT 受保护
- 开发中为了防止误操作会设置此模式
- 主表中存在级联数据,若受保护则删除不成功
- 主表中不存在级联数据删除成功
- SET
- SET_NULL
- 提前设置字段允许为空
- SET_DEFAULT
- 提前设置字段默认值
- SET()
- 自定义指定值
- SET_NULL
- 级联数据获取
- 主获取从:隐性属性,默认就是级联数据的名字
- 从获取主:显性属性,就是属性的名字
- 级联表同时删除
- 应用场景
- 1:M
- ForeignKey
- 从获取主
- 主从获取:隐性属性,级联模型_set
- student_set Manager的子类
- all
- filter
- exclude
- Manager上的函数皆可使用
- student_set Manager的子类
- 主从获取
- 显性属性
- 主从获取:隐性属性,级联模型_set
- M:N
- 开发中很少使用多对多属性,而是自己维护多对多关系
- 产生表时会产生单独的关系表
- 关系表中储存关联表的主键,通过多个外键实现
- 多个外键值不能同时相等
- 级联数据获取
- 从获取主
- 使用属性,属性是一个Manager子类
- 主获取从
- 隐性属性
- 从获取主
- 级联数据
- add
- remove
- clear
- set
- ManyRelatedManager
- 函数中自定义的类
- 并且父类时一个参数
- 动态创建
9、模型继承
- 默认继承会将通用字段放到父表中,特定字段放在自己表中,中间使用外键连接
- 关系太复杂,效率低,查询慢
- 父类表中会有过多数据
- 使用元信息来解决这个问题
- 使模型抽象化
class Meta: abstract = True
- 抽象模型不会在数据库中产生映射
- 子模型映射出来的表直接包含父模型的字段
- 使模型抽象化
10、在开发中
- model -> sql
- 都可以使用
- sql -> model
- 使用
python manage.py inspectdb
- 可直接根据表生成模型
- 元信息中包含
manage=False
- 使用
- 若自己的模型不想被迁移管理,也可以使用
manage=False
进行申明
若有其他问题可以关注微信公众号“夜寒信息”,后台客服,为您解答
微信关注公众号:夜寒信息
致力于为每一位用户免费提供更优质技术帮助与资源供给,感谢支持!