1.建django项目工程

1.1新建一个工程

  • 首先我在D:\PycharmProject下面先新建了一个工程文件夹为myweb
  • 打开cmd窗口进入D:\PycharmProject\myweb目录下,使用命令django-admin startproject myweb创建创建一个工程,创建成功后D:\PycharmProject\myweb文件夹下会生成这些文件,如图:

image.png

1.2新建一个子应用app

  • 还是cmd窗口D:\PycharmProject\myweb目录下,执行 python manage.py startapp app (新建 app)
  • 创建成功后到开app包会有如下文件,如图:

image.png
此时新建工程这里基本完了,如果后续扩展有需要加子应用(子模块)就重复上面操作,改一下子应用名字就好。

1.3配置settings文件

1.3.1激活子应用的配置

  • 打开settings文件找到INSTALLED_APPS配置项,在其中加入你的子应用app,如图

image.png

1.3.2设置语言和时间

  • LANGUAGE_CODE = ‘zh-Hans’
  • TIME_ZONE = ‘Asia/Shanghai’

    1.3.3模板template的配置(前期可以只做后端,前端不考虑,可以暂不做配置)

    BASEDIR=BASEDIR = Path(__file).resolve().parent.parent 这个不用动,这里只是为了给大家列出这个配置项的源代码没有其他意思
    image.png

    1.3.4中间件配置

  • 我自己写了个统一异常处理的中间件,重写了process_exception方法,然后在中间件配置项中加入即可如图:

image.png

  • 这里附上中间件文件代码:

image.png

1.3.5接口路径末尾自动加“/”的配置项:

  • APPENDSLASH = False #为Ture时其作用就是自动在网址结尾加’/’。_

1.4配置路由

注意:这里打开的是主应用里urls.py文件
image.png

2.数据模型介绍

2.1什么是Model模型

Model (模型) 简而言之即数据模型(数据库的映射)。模型不是数据本身(比如数据库里的数据),而是抽象的描述数据的构成和逻辑关系。每个Django model实际上是个类,继承自models.Model。每个Model应该包括属性关系(比如单对单,单对多和多对多)和方法。当你定义好Model模型后,Django的接口会自动帮你在数据库生成相应的数据表(table)。这样你就不用自己用SQL语言创建表格或在数据库里操作创建表格了,是不是很省心?

2.2什么是ORM

ORM,即Object-Relational Mapping(对象关系映射),它的作用是在关系型数据库和业务实体对象之间作一个映射,这样,我们在具体的操作业务对象的时候,就不需要再去和复杂的SQL语句打交道,只需简单的操作对象的属性和方法

2.2.1模型成员objects

Django默认通过模型的objects对象实现模型数据查询

2.2.2数据查询和过滤

过滤实际上就相当于SQL语句中的where语句,和过滤相关的方法或函数如下:

  • all() : 返回所有的数据,得到的是一个列表
  • filter() :返回复合条件的数据,条件可以有多个,多个条件用 ‘,’ 隔开,得到的结果也是一个列表
  • exclude() :过滤掉符合条件的数据,返回一个列表
  • order_by() : 按照指定字段进行排序
  • values() : 每条数据都作为一个字典,放在一个列表中
  • get() : 也可以接受多个条件,与 filter 不同,这里返回的是一个满足条件的对象,为单个值,且如果没有符条件的就会报MultiObjectReturned错误,而 filter 不会报错,而是返回一个空列表。如果你的条件满足果,是两个对象就不能用get,换成filter
  • first():返回查询结果中的第一个对象
  • last():返回查询结果中的最后一个对象
  • count():返回当前查询结果中的对象个数
  • exists():判断查询结果中是否有数据,如果有数据返回True,没有返回False

    2.2.3数据查询和过滤

    限制结果的条数,类似于SQL中的limit和offset。在ORM中则是使用下标的方式去限制,这里有点类似于 python 中列表的下标运算,只是这里的下标不能为负数。如:模型名.objects.all()[0:5]

    2.2.4ORM中的模糊查询

  • startswith : 匹配开始字符串

  • endswith : 匹配结束字符串
  • contains : 匹配包含该字符串的项
  • 示例:

image.png
当然了filter结果为一个列表,即使根据条件只匹配到一个对象

2.2.5ORM中的比较运算符

  • isnull,isnotnull:是否为空。

如:filter(sname__isnull=True)

  • in:是否包含在范围内。这个类似python中的in

如:filter(id__in=[1,2,3])

  • gt,gte,lt,lte:大于,大于等于,小于,小于等于。

如:filter(age__gt=10)

  • pk:代表主键,也就是id。(一般模型定义的时候默认id主键)

2.2.6聚合函数

与SQL中的聚合函数一样,只是ORM中药通过ggregate()函数获得聚合函数的返回值。

  • Avg:求平均值
  • Count:求次数
  • Max:求最大值
  • Min:求最小值
  • Sum:求和

    例如: Student.objects.aggregate(Max(‘age’))

    2.2.7 F对象和Q对象

    导入F对象和Q对象: from django.db.models import F, Q

  • F对象:使用在模型的A属性与B属性进行比较的时候,比如要比较一个学生的A成绩和B成绩的时候就需要用到F对象。例如下面两个例子:

  • 给Book所有实例价格(retail_price)涨价20元

  • Book.objects.all().update(retail_price=F(‘retail_price’)+20)#获取该列所有值并加20
  • 对数据库中两个字段的值进行比较,列出哪儿些书的零售价高于定价

  • books = Book.objects.filter(retail_price__gt=F(‘price’))
    • Q 对象相比 F 对象更加复杂一点,它主要应用于包含逻辑运算的复杂查询。Q 对象把关键字参数封装在一起,并传递给 filter、exclude、get 等查询的方法。多个 Q 对象之间可以使用&或者|运算符组合(符号分别表示与和或的关系),从而产生一个新的 Q 对象。当然也可以使用~(非)运算符来取反,从而实现NOT查询。Q 对象的导入方式如下所示:
    • 1)Q 对象位于一个数据包里面。常用语法格式如下:
  • Q(条件1)|Q(条件2)# 条件1成立或条件2成立
  • (条件1)&Q(条件2)# 条件1和条件2同时成立
  • Q(条件1)&~Q(条件2)# 条件1成立且条件2不成立
  • 2)Q 对象在实际的应用中往往是较为复杂的,和常和逻辑运算符一起使用
    • Book.objects.filter(Q(retail_price__lt=35)|Q(pub_id=’2’))#两个Q对象是或者的逻辑关系;查找c语言中文网出版的书或价格低于35的书
    • Book.objects.filter(Q(retail_price__lt=45)&~Q(pub_id=’2’))#条件1成立条件2不成立; #查找不是c语言中文出版书且价格低于45的书

2.3Model模型的作用

  • 根据对象类型生成表结构
  • 将对象、列表的操作,转换成SQL语句
  • 将SQL查询到的结果转换为对象、列表

    2.4定义模型类常用的属性(表字段的定义)

    2.4.1字段类型

    image.png

    2.4.2字段选项

    image.png

    2.4.3 关系字段类型

    image.png

  • 一对多:一个班里可以有多个学生,但这个学生只能在一个班里,这里的“一”指的就是班级,“多”指得就是学生

  • 多对多:一本书可以被定义为多个标签,而一个标签也可以属于多本书,所以书与标签之间属于多对多关系。
  • 一对一:员工与工号一对一

    2.4.4 外键字段的参数的详解:(重点)

  • CASCADE:级联操作。如果外键对应的那条数据被删除了,那么这条数据也会被删除。

  • PROTECT:受保护。即只要这条数据引用了外键的那条数据,那么就不能删除外键的那条数据。如果我们强行删除,Django就会报错。
  • SET_NULL:设置为空。如果外键的那条数据被删除了,那么在本条数据上就将这个字段设置为空。如果设置这个选项,前提是要指定这个字段可以为空。
  • SET_DEFAULT:设置默认值。如果外键的那条数据被删除了,那么本条数据上就将这个字段设置为默认值。如果设置这个选项,== 前提是要指定这个字段一个默认值 ==。
  • SET():如果外键的那条数据被删除了。那么将会获取SET函数中的值来作为这个外键的值。SET函数可以接收一个可以调用的对象(比如函数或者方法),如果是可以调用的对象,那么会将这个对象调用后的结果作为值返回回去。== 可以不用指定默认值 ==
  • DO_NOTHING:不采取任何行为。一切全看数据库级别的约束。

[

](https://blog.csdn.net/xujin0/article/details/83552349)

2.5模型设计示例

本示例完成“学生-班级”信息的维护,需要存储两种数据:学生表、班级表

2.5.1两张表结构设计代码如下:

image.png

  • 这两张表模型都是建立在继承了moels.Model类基础上
  • 学生表我定义了5个字段:id,学生名,年龄,性别,cls建立关联关系的外键字段(to=外键表为班级)
  • verbose_name参数就是定义的字段详细注释,可以这么理解
  • str方法表示你从学生表通过名字指定,取出来一个学生对象(对象包含了定义的4个字段),Students.objects.get(sname=’张三’)如果没有str定义返回字段,那你打印这个对象结果就是,但是并没有直观的显示这个数据是谁;相反他会把对象的数据也打印出来
  • class Meta中的db_table参数可以认为是给表起别名,例如我想用小写的表名就db_table=students

    2.6生成数据

    2.6.1激活模型

  • 编辑settings.py,将你的models.py所在的子应用加入到install_apps中

屏幕截图 2021-10-30 184532.png

  • 这个app是我在自己项目myweb里建的一个子应用,也可以叫子模块;相对应的app下方的这个myweb是主应用,最上层的myweb只是个项目总目录,和主应用名字一样

    2.6.2 生成迁移文件:

    生成迁移文件:根据模型类生成sql语句。 迁移文件被生成到子应用app的migrations目录。
    这个迁移文件里内容是创建表的sql,但还没有执行
    终端输入 python manage.py makemigrations 命令

    2.6.3 执行迁移

    执行迁移文件里的创建表的sql
    python manage.py migrate

3.站点管理

可以理解为django自己所提供的一个管理数据库表的可视界面

3.1站点管理特性

  • 读取模型中的元数据,然后提供给你一个强大而且可以使用的界面,网站管理者可以用它立即工作
  • django的管理工具被称作 django.contrib.admin

    3.2创建管理员

    还是myweb文件夹下执行:python manage.py createsuperuser
    然后再输入用户名,电子邮件,密码

    3.3管理界面现实的语言和时间

    这里就用带了前面settings文件里的配置项了
    image.png

    3.4管理站点注册模型

    3.4.1列表页属性

  • list_display: 显示字段,可以点击列头进行排序
    list_display[‘pk’, ‘btitle’, ‘bpub_date’]

  • list_filter: 过滤字段,过滤框会出现在右侧
    list_filter = [‘btitle’]
  • search_fields: 搜索字段,搜索框会出现在上测
    search_fields = [‘btitle’]
  • list_per_page: 分页,分页框会出现在下册

    3.4.2注册模型

    打开app/admin.py文件,注册模型,代码如下:
    image.png

  • list_display ,search_fields,list_per_pag 这三者在图中的说明:

image.png

  • fieldsets = [(None, {‘fields’: [‘sname’,’cls’]}), (‘other information’, {‘fields’: [‘gender’, ‘age’], ‘classes’: [‘collapse’]})] 在图中的效果

image.png
image.png

  • 至于那个filter_horizontal和filter_vertital我还没研究呢,有兴趣的小伙伴可以查看一下
  • admin.site.register(Students,StudentsAdmin)这个是在站点管理界面设置了学生表的显示方式,所以后面也要加上StudentsAdmin类,如果不做要求按照默认,就不用自定义管理类(StudentsAdmin)就直接注册就好比的班级表Classes, 我就是直接注册模型类就行了如: admin.site.register(Classes)

4.视图

4.1视图

4.1.1 什么是视图

  • 视图通常是一个python函数,可以叫视图函数,或者简称视图,定义在 应用/views.py 文件中。
  • 响应内容:一般是一个网页的HTML内容、一个重定向、错误信息页面、json格式的数据
  • 类视图(了解,区别于函数视图),即把请求方法封装到一个类里

    4.1.2 视图的作用

  • 作用:接收并处理请求,调用M和T,响应请求(返回HttpResponse或其子类)

  • 每一个用户请求,都对应着一个视图(和url地址),由视图处理请求后,经过html渲染后再返回html页面内容给浏览器显示。(前期我没考虑html)

    4.1.2 视图的设计

  • get请求设计

image.png

  • post请求代码设计如图

image.png

4.1.3 子应用的路由配置

image.png

4.1.4 路由中as_view方法源码解析

image.png

  • 对于view返回的dispatch()方法的描述

image.png

5.接口演示

5.1 get请求:请求参数(也是url?后的参数)

  • 一个参数name的情况

image.png

  • 姓名+性别组合参数

image.png

5.2get请求:地址路径中存在位置参数的案例(网上找的)

image.png

5.3post请求只能用代码来实现或者postman了,浏览器只适合get请求,在没有做前端时候

image.png

5.4 公共状态码code枚举类封装:

image.png

5.4 公共响应信息result的封装:

image.png

image.png

6.序列化器的分析:

6.1序列化的作用

  • 作用一:给参数instance赋值对象,将模型中的对象转换成字典

    1. stu_obj = Students.objects.get(id=1); ser = StudentSerializer(instance=stu_obj)这是针对于单对象的,如果多对象需要用到filter过滤 stus = Students.objects.filter(sname=’张三’),多个叫张三的对象,ser=StudentSerializer(instance=stus,many=True)需要设置many参数为真,查看序列化为字典结果 print(ser.data),一定要带.data
  • 作用一:给参数data赋值字典,将字典转换成模型的对象

    1. stu_dict={‘sname’:’王者’,’age’:20, gender:1}; stu_obj=StudentSerializer(data=stu_dict)当然了你如果批量增加多个数据,那你就设置many参数即可

6.2序列化的使用:

6.2.1 序列化器的使用
你会发现我的每个字段都得写一遍很罗嗦,这里就要提到另一个序列化:模型序列化
image.png
6.2.2 模型序列化器的使用
image.png

6.3外键的序列化:

6.3.1 采用子序列化

  • Django中的子序列化的功能是:通过跨表查询数据然后对跨表查到的数据反序列化。
  • 如果涉及到通过外键进行跨表查询,然后再将查询数据反序列化到前台就需要用到子序列化,比如下面的例子:我们查询出版社信息的时候连带将book表中的该出版社所出版过的书名一并查出来。
  • 子序列化的使用方法及注意事项:
  • 1)只能在序列化中使用
  • 2)字段名必须是外键(正向反向都可以)字段,相对于自定义序列化外键字段,自定义序列化字段不能参与反序列化,而子序列化必须为外键名,子序列化字段不写入数据库。
  • 3)如果外键关联的表有多个字段时,需要设置子序列化字段many=True。
  • 4)子序列化是单向操作,因为作为子系列的类必须写在上方,所以不能产生逆方向的子序列化
  • image.png
  • image.png

6.3.2 自定义返回外键字段的返回

  • 对于查询pickle模型数据时,果你觉得返回外键字段只是个id,不能直观查出外键对应表的详细信息,你就可以自定义一个字段返回你想要返回的字段,通过重写to_representation方法,允许我们我们改变序列化输出
  • image.png


7 django常见的问题

7.1 模型增添或修改字段

7.1.1 迁移文件不生效问题

  • 问题:如你已经生成数据表了,又想对一个模型做一些修改,增加一个定义字段,需要你到cmd里重新执行关于迁移文件的那两个命令,可能会出现执行完python manage.py migrations正常后,在执行第二句命令python manage.py migrate 会出现没有执行迁移文件,也就是新改的东西没有生效,如图:

image.png

  • 解决办法:
    1. 删除该app名字下的migrations下的init.py等文件
    2. 进入数据库,找到django_migrations的表(数据库的对应表的修改记录),删除该app名字的所有记录。执行sql语句:delete from django_migrations where app=”app名字”

image.png

  1. 再此执行python manage.py migrate 就好了

7.1.2 执行迁移文件命令报异常如图:

  • 问题截图如下
  • image.png
  • 解决办法:python manage.py migrate app名字 —fake(app名字是子应用名我的就叫”app”)同步表结构
  • image.png

    这里基本就完事了告一段落了!!!谢谢大家。。。