Django框架总结

一、Django框架前言知识:

1、C/S和B/S的区别:

  • C/S结构软件:
    客户端/服务端软件,即客户端要自己下载,安装之后才能访问服务端,服务端为开发的服务器。
  • B/S结构软件:
    浏览器/服务端软件,即客户端不需要自己下载,客户只需要在电脑上用浏览器访问客户端即可访问服务端。
  • 一般的web框架都是B/S结构软件,在浏览器上输入http://www.127.0.0.1/(默认端口8000)即可访问。

2、URL构成:

http://www.aspxfans.com:8080/news/index.aspboardD=5&ID=24618&page=1#


1、协议部分:http
2、域名部分:www.aspxfans.com
3、端口部分:8080
4、虚拟目录部分:从域名后’的第一个”/“到最后一个”/“为止,news
5、文件名部分:从域名红的最后一个”/“开始到”结束,index.aspboard
6、锚部分:从”#“开始
7、参数部分:从”开始,参数都是键值对形式。


二、Django框架基本流程

10、启动服务器

通过浏览器访问 http://127.0.0.1:8000/ 可进行访问服务器

11、创建超级管理员

修改为:

向 admin 注册 booktest 的模型
打开 booktest/admin.py 文件,注册模型

刷新管理页面,可以对 BookInfo 的数据进行增删改查操作
自定义管理页面
Django 提供了 admin.ModelAdmin 类
通过定义 ModelAdmin 的子类,来定义模型在 Admin 界面的显示方式

三、 Model

ORM 简介

ORM(Object-Relation Mapping)—对象关系映射:
它是MVC框架很重要的一部分,实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库。
这个中间件可以独立存在于框架之外,在MVT框架中可以将用python语言书写的模型类映射成数据库表,用python语言来代替复杂的SQL语句来对数据库进行CDRU操作,最后返回对应的对象和列表。
ORM分为两种:
1、DB First:数据里先创建表,然后根据表结构,生成对应的代码
2、Code First:先书写对应的代码,再执行代码生成对应数据库表
使用ORM的优点:
-摆脱复杂的 SQL 操作;
-让数据结构变得简洁;
-数据库迁移成本更低;

开发流程

1、在 models.py 中定义模型类,要求继承自 models.Model
2、把应用加入 settings.py 文件的 installed_app 项
3、生成迁移文件
4、 执行迁移生成表
5、使用模型类进行 crud 操作

定义属性

  1. 导入 from django.db import models
  2. 通过 models.Field 创建字段类型的对象,赋值给属性Python 之:
    对于重要数据都做逻辑删除,不做物理删除,实现方法是定义 isDelete 属性,类型为BooleanField,默认值为 False

字段类型

1.AutoField:一个根据ID自动增长的 IntegerField
Django会为表自动增长的主键列,如果使用设置的主键列,django不会再生成默认的主键列

2.BooleanField:true/false字段
3.NullBooleanField:支持null、true、false三种
4.TextField:大文本字段,一般超过4000使用
5.CharField(max_length=字符长度):字符串类型
6.IntegerField:整型
7.DecimalField(max_digits=None,decimal_places=None): 十进制浮点型
—–DecimalField.max_digits:位数总数
—–DecimalField.decimal_paleces:小数点后的数字位数
8.FloatField:浮点型
9.DateField(auto_now=False,auto_now_add=False):日期类型
—–DateField.auto_now:每次保存对象时,自动设置该字段为当前时间,用于”最后一次修改”的时间戳,它总是使用当前日期,默认为 false
—–DateField.auto_now_add:当对象第一次被创建时自动设置当前时间,用于创建的时间戳,它总是使用当前日期,默认为 false
—–auto_now_add, auto_now, and default 这些设置是相互排斥的,他们之间的任何组合将会发生错误的结果,因此只能设置一个
10.TimeField:时间字段,参数如DateField所示
11.DateTimeField:时间日期字段,参数如DateField所示
12.FieField:上传文件字段
13.ImageField:图片字段
———上传路径设置:

字段选项

null:如果为 True, Django 将空值以 NULL 存储到数据库中,默认值是 False
blank:如果为 True,则该字段允许为空白,默认值是 False
—–对比: null 是数据库范畴的概念, blank 是表单验证证范畴的
—–如果一个字段设置为 blank=True,表单验证时允许输入一个空值。而blank=False,则该项必需输入数据。
db_column:字段的名称,如果未指定,则使用属性的名称
db_index:若值为 True, 则在表中会为此字段创建索引
default:默认值
primary_key:若为 True, 则该字段会成为模型的主键字段
unique:如果为 True,该字段在表中必须有唯一的值
verbose_name 字段的一种说明,在 form 中不会显示,和 label 是这个 Field 在 form中会显示的文本提示
help_text:会在 form 表单控件中显示 help 文本

关系

1.OneToOneField:一对一关系,将字段定义在任意一端中
跨表访问数据库表:
——有外键字段的表:对象.外键字段
——无外键字段的表:对象.模型类小写
2.ForeignKey:一对多关系,将字段定义在多的一端中
跨表访问数据库表:
——有外键字段的表:对象.外键字段
——无外键字段的表:对象.模型类小写._set()
3.ManyToManyField:多对多关系,将字段定义在任意一端中
会在数据库中生成第三张表,例如:

添加

a=Application(‘qq’)
a.save()
h1=Host(hostname=‘host1’,ip=‘192.168.1.20’,port=‘8000’)
h1.save()
h2=Host(hostname=‘host2’,ip=‘192.168.1.21’,port=‘8001’)
h2.save()
h3=Host(hostname=‘host3’,ip=‘192.168.1.22’,port=‘8002’)
h3.save()
a.r.add(1) #对第三张表添加 application_id=1,host_id=1

查询

a.r.all()

反向查询(在没有 ManyToManyField 字段的表中查)

h1.application_set.all()

元选项

——在模型类中定义类Meta,用于设置元信息
————元信息:db_table:定义数据库表名,推荐使用小写字母,数据库表有默认表名
———— ording:数据库表有默认排序,字符串前加-表示倒序,不加-表示正序

管理器Manager

管理器是 Django 的模型进行数据库的查询操作的接口,用于与数据库进行交互,Django应用的每个模型都拥有至少一个管理器当定义模型类时没有指定管理器,则 Django 会为模型类提供一个名为 objects 的管理器

自定义管理器:

继承 models.Manager
自定义管理器类主要用于两种情况
情况一:向管理器类中添加额外的方法:见下面“创建对象” 中的方式二
情况二:修改管理器返回的原始查询集:重写 get_queryset()方法
当为模型类指定管理器后, django 不再为模型类生成名为 objects 的默认管理器

查询

查询集表示从数据库中获取的对象集合返回查询集的方法,称为过滤器
过滤器基于所给的参数限制查询的结果,从 SQL 的角度,查询集和 select 语句等价,过滤器像 where 和 limit 子句,查询集是可迭代的对象.
过滤器:

  • all() : 检索所有的对象
  • filter(**kwargs) : 检索特定的对象 返回一个与参数匹配的 QuerySet
  • exclude(): 返回一个与参数不匹配的 QuerySet
  • order_by(column_name): 检索排序后的对象
  • column_name:排序的列,默认升序, 列名前加- 降序排序
  • get():返回单个满足条件的对象
    如果未找到会引发”模型类.DoesNotExist”异常
    如果多条被返回,会引发”模型类.MultipleObjectsReturned”异常
  • count():返回当前查询的总条数
  • first():返回第一个对象
  • last():返回最后一个对象
  • exists():判断查询集中是否有数据,如果有则返回 True

查询集返回列表,可以使用下标的方式进行限制,等同于 sql 中的 limit 和 offset 子句,不支持负索引

条件查询

实现 where 子名,作为方法 filter()、 exclude()、 get()的参数
语法:属性名称__比较运算符=值
表示两个下划线,左侧是属性名称,右侧是比较类型
对于外键,使用“属性名_id” 表示外键的原始值
转义: like 语句中使用了%与,匹配数据中的%与,在过滤器中直接写,例如:
filter(title__contains=”%”)=>where title like ‘%%%’,表示查找标题中包含%的

比较运算符

  • 判等:exact
  • 包含:contains
  • 开头或结尾:startswith/endswith
  • 是否为空:isnull
  • 大小写不敏感:在前面加上i表示不区分大小写
  • 不连续查询
    – in:是否包含在范围内
    –gt、gte、lt、lte:大于、大于等于、小于、小于等于
  • 时间日期查询:
    – year、 month、 day、 week_day、 hour、 minute、 second
    – 对日期时间类型的属性进行运算:

跨关联查询

语法:模型类名_属性名_比较,相当于SQL语句中inner join

聚合函数

使用aggregate()函数返回聚合函数的值
函数:Avg、Count、Max、Min、Sum

F对象

  1. 通常情况下我们更新数据时先从数据库里将原数据取出放在内存后,然后修改对应的值,最后保存到数据库。
    当框架中出现F对象时,django会使用SQL语句的方式取代标准的python操作,python唯一做的操作是生成一条SQL语句,在数据库中完成对对应属性的更改,这种方式可以在多并发的情况下提高操作的效率,减少多线程操作带来的风险。
  2. 可以使用F对象完成两个字段中值的比较,此外,F对象还能完成算数运算,例如:

Q对象

在使用过滤器进行查询时,可以对查询条件进行限制,当有多个条件时,要使用Q对象够构造相应的语句。
构造符 :&(与)、|(或)、 ~(非)

四、View

view1.png
视图的本质就是一个函数,被定义在view.py文件中,响应的可以是一张 页的HTML内容,一个重定向,一个404错误等

URLconf

在django框架中,提供了非常清晰简洁的url管理方法。
步骤:
1.在根级urls.py文件中加入 应用的url配置:

2.在应用中新建urls.py文件:

include()方法

include(arg, namespace=None)

  • arg:包含 应用的 urlconf
  • namespace:定义命名空间,用于反解析

url()方法

def url(regex, view, kwargs=None, name=None)

  • regex : 正则表达式
  • view: 视图函数
  • name: 名称
  • name 用来唯一区分一个视图对应多个 urlconf 的场景
  • kwargs: 就是一个字典类型的参数

编写 URLconf 的注意

  • 不需要添加一个前导的反斜杠,如应该写作’booktest/’,而不应该写作’/booktest/’,否则意味着从根目录匹配
  • 每个正则表达式前面的 r 表示字符串不转义,请求的 url 被看做是一个普通的 python 字符串,进行匹配时不包括 get 或 post 请求的参数及域名。

http://www.qikuedu.com/python/1/=1&p=new,只匹配“python/1/” 部分
性能: urlpatterns 中的每个正则表达式在第一次访问它们时被编译,这使得系统相当快

匹配url过程:

先与主URLconf匹配,成功后再用剩余的部分与应用中的URLconf匹配

URL反向解析

  • 问题: 如果在视图、模板中使用硬编码的链接,在 urlconf 发生改变时,维护非常麻烦
  • 解决: 通过指向 urlconf 的名称, 根据正则表达式动态生成链接地址
  • 视图中的使用: 使用 django.urls.reverse()函数

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2021年5月12日
下一篇 2021年5月12日

相关推荐