做网站厦门/兰州网络推广优化怎样
Django框架
- 0x00、Django 项目五件套
- 0x01、主要目录配置
- settings.py
- 0x02、应用
- 创建应用
- 配置应用
- 0x03、视图与路由配置
- path()函数
- re_path() 函数
- 0x04、Django数据库-ORM框架
- Django 数据库配置
- 在 Django 框架中创建模型
- 模型类-常用字段类型
- 模型类-字段选项
- 模型类值-Meta类
- 激活模型
- 执行数据库迁移:
- ORM-操作
- ORM 创建数据
- ORM 查询数据
- ORM 更新数据
- ORM 删除数据
系统环境:Django 3.2.4,python 3.8.0,mysql 5.7
0x00、Django 项目五件套
- jango的启动服务
python manage.py runserver ip:port
- Django创建项目
# 在你想创建项目的文件夹下
django-admin startproject '项目名'
- 创建应用
# 在创建好的 Django 项目的根目录下
python manage.py startapp '应用名'
- 数据库迁移
python manage.py migrate
- 数据库表更改
python manage.py makemigrations '应用名'
0x01、主要目录配置
- 项目文件夹下存在一个同名文件,包含Django项目的主要配置文件
settings
:Django项目启动的所有配置项wsgi
:web服务配置文件urls
:主路由配置文件,所有的HTTP请求会先通过这个文件,在进行路由
settings.py
配置项格式规范:大写字母 = ‘’
- 公有配置:官方提前规定好的 诸多配置
- 如:
BASE_DIR
=os.path.dirname(os.path.dirname(os.path.abspath(file))) 获取当前项目文件根目录。 DEBUG
:- True ---- 调式开发模式,Django可以侦测到项目的任何改动,随后立即重启服务;可以生成详细报错页面
- False ---- 正式启动模式/上线模式
ALLOWED_HOSTS
:允许访问的请求头范围- [*] ---- 允许所有请求
INSTALLED_APPS
:指定当前项目中安装的应用列表MIDDLEWARE
:用于注册中间件ROOT_URLCONF
:Django 的主路由文件TEMPLATES
:指定模板的配置信息DATABASES
:数据库配置LANGUAGE_CODE
:Django项目语言 zh-Hans(中文)、en-us(英文)TIME_ZONE
:指定当前服务器端时区 UTC(世界标准时间) Asia/Shanghai(中国时区)
- 如:
- 自定义配置
- 避免与公有配置名冲突
0x02、应用
- Django框架中 项目与应用之间的关系:
一个 Django 项目可以包含多个应用,一个应用可以在多个项目中。
- 项目是特定网站的配置和应用程序的集合。
- 应用是可执行某些操作的 web 应用程序。
- polls/migrations:存放数据库模型的迁移文件
- polls/apps:应用的相关配置
- polls/models:用来写对象模型(创建数据库表)的文件
- polls/tests:Django框架 提供的测试模块的入口
- polls/views:视图函数接口文件
- polls/urls:作用等同于项目的 urls.py 文件,是应用的路由文件,这个需要自己手动创建
创建应用
# 在创建好的 Django 项目的根目录下 python manage.py startapp '应用名'# ex: polls python manage.py startapp polls
- 创建完成后,根目录下会出现应用的文件夹
配置应用
在 settings.py 中进行配置,告知 Django 应用的创建
...
INSTALLED_APPS = ['django.contrib.admin', # Django项目自带的应用'django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles','polls.apps.PollsConfig', # 自己创建的应用
]
...
- 在上述 settings.py 文件的配置中,前面的app都属于 Django项目创建时自带的内容,最后一条是当自己创建新的 app时需要手动添加上去的应用。
0x03、视图与路由配置
- Django 处理浏览器请求流程
- 1、找主路由配置文件
- 2、加载文件中的路由配置
urlpatterns
- 3、依次匹配
urlpatterns
中提前配置好的路由信息 - 4、匹配成功,则调用对应的视图处理函数
- 5、匹配失败,404
- 视图函数 用于接收一个浏览器请求进行处理,并通过HTTPResponse对象返回响应的函数。
settings
:ROOT_URLCONF 主路由配置路由加载path的顺序是由上到下逐步进行。
path()函数
- 语法:path(route, views, kwargs,name=None)
route
:以 URL 模式解析字符串,包含四种模式,依次向下选择。views
:指定路径所对应的视图处理函数的名称。kwargs
:任意关键字参数可以在字典中传递给目标视图。name
:为地址起别名,在模板中地址反向解析时使用。
# Django默认配置
path('admin/', admin.site.urls)
# 自行添加配置
path(utl子路径, 项目包结构路径)
- 当项目足够庞大时会包含或多应用,每个应用下也会包含路由,此时可以利用
include()
函数去指引主路由将它导向对应应用下的子路由去,即所谓的分布式路由
# 项目同名文件下的 urls.py文件 path('polls/', include(polls.urls))
# polls/urls 下的路由 path('', views.index, name="index") # polls/views.py文件的 index视图函数,name为解析路由时的别名(在url反向解析中会讲到)
- path-route 的模式
str
:匹配除 ‘/’ 之外的非空字符串- resource/<str:username> 匹配 /resource/miger
int
:匹配0或者任何正整数。返回一个int- resource/<int:page> 匹配 /resource/100
slug
:匹配任意有ASCII字母或数字以及连字符和下划线组成的短标签- resource/<slug:sl> 匹配 /resource/this-is-django
path
:匹配非空字段,包括路径分隔符’/’- resource/<path:ph> 匹配 /resource/goods/a/b/c
上述转换器后的参数,为所路由的视图函数的参数:username、page、sl、ph等
re_path() 函数
通过设置正则表达式,可以进行更精准的参数匹配。
- **示例:**只接收
<=2
位数字的计算
urlpatterns=[re_path(r'^(?P<x>\d{1,2})/(?P<method>\w+)/(?P<y>\d{1,2})$', views.caculate, name='caculate'),
]
如上通过命名分组实现正则表达式匹配:
- (?P<x>\d{1,2}):
- (?P) 属于命名分组规范;
- x 表示分组名,也就是接收的参数名;
- \d{1,2} 属于正则表达式,表示接收2位整数。后面同理。
0x04、Django数据库-ORM框架
ORM(Object Relational Mapping)即 对象关系映射,它开发人员使用类和对象对数据库进行操作,从而避免直接通过SQL语句操作数据库,使开发简洁高效。
- ORM 与 数据库的对应关系:
- 类 – 数据表
- 对象 – 数据行
- 属性 – 字段
Django 数据库配置
django 支持任何主流的数据库,但每个数据库的配置存在差异,django的数据库配置默认是sqlite,若需要修改为mysql数据库,参考一下操作。
- 首先需要安装适当的数据库绑定,项目同名文件下的
__init__.py
中添加如下内容
解决如下报错:
import pymysql
pymysql.install_as_MySQLdb()
- 紧接着需要修改
settings.py
文件中关于DATABASES的设置
DATABASES = {'default': {'ENGINE': 'django.db.backends.mysql', # 固定写法,django的mysql驱动'NAME': 'GMS', # 数据库名'USER': 'root', # 数据库的用户名'PASSWORD': 'password', # 数据库的密码'HOST': 'xxx.xxx.xxx.xxx', # 所在的ip地址'PORT': 3306,'OPTIONS': {'charset': 'utf8mb4', "init_command": "SET foreign_key_checks = 0;"},'CONN_MAX_AGE': 180,}
}
- 配置修改完成后,根据django框架项目与应用的特性,新建的django项目默认包含一些应用,这些应用至少使用一个数据库表,因此我们需要在数据库中创建表才能使用他们。django为我们提供了如下的命令,帮助我们自动创建这些表。
python manage.py migrate
在 Django 框架中创建模型
django 框架的每个模型都是由一个类表示,django提供了自己的一套 ORM 规范供使用者使用。
- 每个模型都被表示为
django.db.models.Model
类的子类,类的变量代表模型中的一个数据库字段。- 每个字段都由一个
Field
类的实例表示,如:字符字段–CharField、日期时间–DateTimeField。- 每个 Filed 类实例的名称就是字段的名称。如: name=models.CharField(max_length=200) , 则 name 为列名(字段名)
- 一些 Filed 类有一些必需的参数,如:CharField 实例需要参数
max_length
ForeignKey
,定义外键关系
# 模型类创建语法
from django.db import models
class 模型类名(models.Model):字段名 = models.字段类型(字段选项)
模型类-常用字段类型
字段类 | 数据库类型 | 描述 |
---|---|---|
BooleanField() | tinyint(1) | 代码中用 True 或 False 表示 |
CharField() | varchar | 必须要指定 max_length 参数值 |
DateField() | date | auto_now :每次保存对象时,自动设置该字段为当前时间(取值:True/False);auto_now_add :当对象第一次被创建时自动设置当前时间(取值True/False);default :设置当前时间(取值:字符串格式时间如:‘2019-6-1’)。以上三个参数只能选一个 |
DateTimeField() | datetime(6) | 表示日期和时间,参数同上 |
FloatField() | double | 代码中使用小数表示值 |
DecimalField() | decimal(x,y) | 编程语言中用小数表示该列的值;数据库中使用小数;参数包括:max_digits :位数总数,包括小数点后的位数。该值必须大于等于decimal_places ;decimal_palces :小数点后的数字数量 |
EmaliField() | varchar | 字符串,Django提供的用于存储邮箱的字段类,可以匹配邮箱。 |
IntegerField() | int | 整数。 |
ImageField() | varchar(100) | 在数据库中用于保存图片的路径;属于字符串类型。 |
TextField() | longtext | 表示不定长的字符数据,用于存储类似文章长度的数据。 |
更多类型 | 官方文档 |
模型类-字段选项
字段选项 | 描述 |
---|---|
primary_key | 设置为True,表示该列为主键;不设置则数据库会默认创建一个自增的id字段 |
blank | 设置为True,字段可以为空;为False,则字段必填 |
null | 设置为True,表示字段为空;为False,建议加入default设置默认值(官方不推荐使用) |
default | 设置所在列的默认值 |
db_index | 为True,表示为该列增加索引 |
unique | 为True,表示字段值唯一 |
db_column | 指定列名;不指定则采用属性名作为列名 |
verbose_name | 设置此字段在admin界面上显示名称 |
更多字段选项 | 官方文档 |
- Model 模型示例
from django.db import models# Create your models here.
class Question(models.Model):question_text = models.CharField(max_length=200)pub_date = models.DateTimeField('date published') # 创建日期时间字段class Choice(models.Model):question = models.ForeignKey(Question, on_delete=models.CASCADE) # 声明与Question的外键关系choice_text = models.CharField(max_length=200) # 定义一个叫 choice_text 的字符串类型的字段votes = models.IntegerField(default=0) # 定义一个叫 votes 的 Int 型字段
模型类值-Meta类
使用内部 Meta
类来给模型赋予属性,Meta类下有很多内建的类属性,可对模型类做一些控制。
from django.db import modelsclass Good(models.Model)name = models.CharField("商品名", max_length=50, default='')price = models.DecimalField('价格', max_digits=7, decimal_places=2, default=0.0)class Meta:db_table = 'good' # Django ORM默认床架的表明是应用名_模型名
激活模型
- 需要我们将应用程序包含在 django 项目中,为此我们需要在
setting.py
文件中的INSTALLED_APPS
告知 django 我们的app。
PollsConfig
位于 polls 应用下的 apps.py 文件中,是创建应用时自动生成的内容。
INSTALLED_APPS = ['django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles','polls.apps.PollsConfig', # 添加的内容
]
- 模型更改三步骤:
- 更改模型(models.py)
- 为这些更改创建爱你迁移
python manage.py makemigrations
- 将更改应用到数据库
python manage.py migrate
执行数据库迁移:
- 当编辑完 models.py 后,我们需要将修改应用到数据库中,这时就需要使用 Django框架的数据库迁移功能。
- 数据库迁移是 Django同步开发人员对模型所做的更改(添加字段,删除模型等)到数据库的方式。
- 首先需要生成迁移文件。运行如下命令,会告知 Django 使用者对模型进行了一些更改,并且希望这些更改被应用。会在应用的
migration
文件夹下生成一个迁移脚本文件.
python manage.py makemigrations
- 打印模型更改内容(这一步可以省略)。在告知更改后,会产生一个如上所示
0001_initial.py
的文件,通过运行如下命令可以在命令行窗口打印出模型的改变如何应用到数据库中,它并不会去执行这些内容。
python manage.py sqlmigrate polls 0001
- 执行迁移脚本程序。在确认没有问题后,我们可以通过运行以下命令,将这些改变真正的应用到数据库中。
python manage.py migrate
ORM-操作
- 基本操作包含增删改查操作,即
CRUD
- 增加(Create)、查询读取(Read)、更新(Upadte)、删除(Delete)
- 语法:
模型类.管理器对象.操作
–user.objects.操作
ORM 创建数据
- 方法一:一步到位(下面将以模型类 user 作为演示)
# user.objects.create(属性1=值1, 属性2=值2, ...) 需要返回一个变量接收返回的实体对象
from userControl.models import userobj = user.objects.create(name='张三', age='20')
- 方法二:先创建模型,然后操作数据库
# obj = user(属性1=值1, 属性2=值2, ...) 需要返回一个变量接收返回的实体对象
# obj.save()
from userControl.models import userobj = user(name='张三', age='20')
obj.save() # 当执行save()方法后,才会将数据存入数据库中
ORM 查询数据
Django 为开发人员提供了多种查询方法。
方法 Mysql 描述 all() SELECT * FROM TABLE 查询全部记录,返回 QuerySet 查询对象(集合的元素是模型类的实例化对象) values(‘列1’, ‘列2’) SELECT 列1,列2 FROM xxx 查询指定列的字段值并返回 QuerySet 对象(集合的元素是字典,每个字典代表一条数据) values(‘列1’, ‘列2’) 同上 同上,但集合的元素是 元组 order_by(’-列’, ‘列’) 会对查询结果根据字段选择性的进行排序,默认按照升序排序,降序排序则需要在列前增加 '-'
表示;可以和其他方法组合get(条件) 查询符合条件的唯一一条记录,若查询到多个结果,则抛出Model.MultipleObjectsReturned异常;若查询不到结果,则抛异常Model.DoesNotExist filter(属性1=值1,属性2=值2) 属性=值 作为条件,查询符合条件的多条记录 exclude(条件) 查询符合条件之外即不包含此条件的全部记录 … 官方文档 下面图片使用的可能和代码不一样,但具体的效果是一样的,使用的是 Django shell 进行查询。
from userControl.models import userusers = user.objects.all() print(users) # 打印出来的是 user实例 的集合如下 for people in users:print('名称:', people.name, '年龄:', people.age)
users = user.objects.filter(name='zhangsan') print(users)
users = user.objects.exclude(name='zhangsan') print(users)
- Django 查询谓词
上述内容根据条件查询,仅仅校验了条件存不存在,但如果是一些需要比较范围的条件,我们该如何进行呢?Django 为我们提供了另一种查询功能,
查询谓词
查询谓词 使用 描述 __exact 属性__exact=1 等值匹配 __contains 属性_contains=‘w’ 包含指定值匹配 __startswith 以 xxx 开始 __endswith 以 xxx 结束 __gt & __gte 属性_gt=10 大于 10 & 大于等于 __lt & __lte 属性_lt=10 小于10 & 小于等于 __in 属性_in=[‘a’, ‘b’, ‘c’] 查询数是否在指定范围内 __range 属性_range=(30,59) 查找数据是否在指定区间范围内即在30~50之间 … 官方文档
ORM 更新数据
- 修改单个数据
- 查:通过
get()
得到要修改的实体对象 - 改:通过
对象.属性
的方式修改数据 - 存:通过
对象.save()
保存数据
- 查:通过
people = Book.objects.get(name='zhangsan')
people.age = 15
people.save()
- 批量更新数据
- 直接调用 QuerySet 的
update(属性=值)
实现批量修改
- 直接调用 QuerySet 的
users = user.objects.filter(name__exact='zhangsan')
users.update(age=15)
ORM 删除数据
- 删除单个数据
- 查找一个指定数据,然后调用
delete()
方法删除
- 查找一个指定数据,然后调用
people = user.objects.get(name__exact='张三')
people.delete()
- 批量删除数据
users = user.objects.filter(age__gt=15) # 年龄大于15岁的人
users.delete()
- 实际情况
实际项目开发中,通常不会轻易的在业务里把数据真正删掉,取而代之的是做
伪删除
,即在表中添加一个布尔型字段(is_activate),默认为True;在执行删除操作时,将数据的is_activate
字段设置为 False。
这里还是要题型一下,Django 的字段类型 BooleanField(default=True) 对应的是数据库中的 tinyint类型,Django会自动处理,向数据库中填入 1或0,即 True或False
以上内容只涉及简单的 Django框架,仅适合初学者,通过我的理解重新构造语句方便大家学习,如有欠妥的地方敬请斧正!😁
后续持续更新!⚡️⚡️⚡️