基于Django的web开发(一)

8 篇文章 0 订阅
1 篇文章 1 订阅

基于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 appnamepython 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='王')
  • startswith
    • 以xx开始 filter(sname__startswith='王')
  • endswith
    • 以xx结束 filter(sname__endswith='王')
  • 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()
          • 自定义指定值
      • 级联数据获取
        • 主获取从:隐性属性,默认就是级联数据的名字
        • 从获取主:显性属性,就是属性的名字
  • 1:M
    • ForeignKey
    • 从获取主
      • 主从获取:隐性属性,级联模型_set
        • student_set Manager的子类
          • all
          • filter
          • exclude
          • Manager上的函数皆可使用
      • 主从获取
        • 显性属性
  • 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进行申明


若有其他问题可以关注微信公众号“夜寒信息”,后台客服,为您解答


微信关注公众号:夜寒信息
致力于为每一位用户免费提供更优质技术帮助与资源供给,感谢支持!


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值