Django框架基础
- unit01
- 一、`Django`基础
-
- [1.1 什么是`Django?`](#1.1 什么是
Django?
) - [1.2 安装与卸载](#1.2 安装与卸载)
-
- [1.2.1 `Python`与`Django`的版本](#1.2.1
Python
与Django
的版本) - [1.2.2 安装](#1.2.2 安装)
- [1.2.3 查看`Django`版本](#1.2.3 查看
Django
版本) - [1.2.4 卸载](#1.2.4 卸载)
- [1.2.1 `Python`与`Django`的版本](#1.2.1
- [1.1 什么是`Django?`](#1.1 什么是
- 二、`Django`项目
-
- [2.1 概述](#2.1 概述)
- [2.2 创建项目](#2.2 创建项目)
- [2.3 启动项目](#2.3 启动项目)
- [2.4 项目的目录结构](#2.4 项目的目录结构)
- [2.5 配置](#2.5 配置)
- [三、`URL` 调度器](#三、
URL
调度器) -
- [3.2 定义`URL`路由](#3.2 定义
URL
路由) - [3.2 定义首页的路由](#3.2 定义首页的路由)
- [3.3 便捷管理路由及视图函数](#3.3 便捷管理路由及视图函数)
- [3.4 路径转换器](#3.4 路径转换器)
-
- [3.4.1 `int`](#3.4.1
int
) - [3.4.2 `str`](#3.4.2
str
) - [3.4.3 `slug`](#3.4.3
slug
) - [3.4.4 `uuid`](#3.4.4
uuid
) - [3.4.5 `path`](#3.4.5
path
)
- [3.4.1 `int`](#3.4.1
- [3.2 定义`URL`路由](#3.2 定义
- 四、模块
-
- [4.1 创建模块](#4.1 创建模块)
- [4.2 注册模块](#4.2 注册模块)
- [4.3 分布式路由](#4.3 分布式路由)
- unit02
- 一、`DTL`
-
- [1.1 什么是`DTL?`](#1.1 什么是
DTL?
) - [1.2 模板配置](#1.2 模板配置)
- [1.3 `render()`函数](#1.3
render()
函数)
- [1.1 什么是`DTL?`](#1.1 什么是
- 二、`DTL`
-
- [2.1 变量](#2.1 变量)
- [2.2 标签](#2.2 标签)
-
- [2.2.1 `for`标签](#2.2.1
for
标签) - [2.2.2 `if`标签](#2.2.2
if
标签) - [2.2.3 表单](#2.2.3 表单)
- [2.2.4 `csrf_token`](#2.2.4
csrf_token
) - [2.2.5 静态资源](#2.2.5 静态资源)
-
- [2.2.5.1 静态资源的配置](#2.2.5.1 静态资源的配置)
- [2.2.5.2 访问静态资源](#2.2.5.2 访问静态资源)
- [2.2.1 `for`标签](#2.2.1
- unit03
- 一、`DTL`
-
- [1.1 标签](#1.1 标签)
- 注释
- [1.2 过滤器](#1.2 过滤器)
- 二、`Http`请求
-
- [3.1 属性](#3.1 属性)
- [3.2 `QueryDict`对象](#3.2
QueryDict
对象)
- unit04
- 一、`HTTP`响应
- 二、模型
-
- [2.1 概述](#2.1 概述)
- [2.2 配置](#2.2 配置)
- [2.3 创建模型](#2.3 创建模型)
- [2.4 数据类型](#2.4 数据类型)
- [2.5 数据迁移](#2.5 数据迁移)
- 三、管理器
- 四、`QuerySet`
- unit05
- 一、模型
- [unit 06](#unit 06)
- 一、`HttpRequest`对象
unit01
一、Django
基础
1.1 什么是Django?
Django
是一个基于Python
语言的、开源的、重量级的WEB
开发框架。
Django
适用于开发各类WEB
应用程序,包括但不限于电商网站、博客等。
Django
的官网:http://www.djangoproject.com
1.2 安装与卸载
1.2.1 Python
与Django
的版本
Django 版本 | Python 版本 |
---|---|
3.2 | 3.6, 3.7, 3.8, 3.9, 3.10 (在 3.2.9 中就已经加入了) |
4.0 | 3.8,3.9,3.10 |
4.1 | 3.8,3.9,3.10,3.11(4.1.3 添加) |
4.2 | 3.8, 3.9, 3.10, 3.11, 3.12 (4.2.8 添加) |
5.0 | 3.10、3.11、3.12 |
1.2.2 安装
shell
$ pip3 install django[==version]
1.2.3 查看Django
版本
shell
$ python3 -m django --version
shell
$ django-admin --version
1.2.4 卸载
shell
$ pip3 uninstall django
二、Django
项目
2.1 概述
Django
项目由一个或多个应用程序(指模块)组成,在每个模块中有相对独立的路由、视图、模型、模板等。
2.2 创建项目
shell
$ django-admin startproject projectname
2.3 启动项目
第一步:在命令行输入以下命令:
shell
$ python3 manage.py runserver [[address:]port]
如:
shell
$ python3 manage.py runserver
$ python3 manage.py runserver 8888
$ python3 manage.py runserver 0.0.0.0:8888
第二步:启动浏览器输入地址即可
在Pycharm
中启动Django
项目
第一步:鼠标右击manage.py
,然后从弹出的快捷菜单中选择Modify Run Configuration
,再在Parameters
文本框中输入runserver [[address:]port]
第二步:鼠标右击manage.py
,然后从弹出的快捷菜单中选择Run manage
2.4 项目的目录结构
tex
djangoBasic/,项目根目录
├── db.sqlite3,默认的sqlite3数据库文件
├── djangoBasic,内层目录 -- 包
│ ├── asgi.py
│ ├── __init__.py
│ ├── settings.py,项目配置文件
│ ├── urls.py,根路由文件
│ └── wsgi.py
└── manage.py,入口文件
2.5 配置
python
# 项目的根目录
BASE_DIR = Path(__file__).resolve().parent.parent
# 是否开启调试模式:在开发环境中需要开启调试模式,在生产环境中需要关闭调试模式
DEBUG = True
# 已安装且启动的应用程序(模块)
INSTALLED_APPS = []
# 已安装且启用的中间件
MIDDLEWARE = []
# 项目的根路由
ROOT_URLCONF = 'djangoBasic.urls'
# 模板(`Templates`)的配置
TEMPLATES = []
# 数据库的配置
DATABASES = {}
# 语言代码
LANGUAGE_CODE = 'zh-Hans'
# 时区
TIME_ZONE = 'Asia/Shanghai'
三、URL
调度器
URL
调度器也称为URL
路由,它允许程序员自由的设计URL
地址
3.2 定义URL
路由
第一步:在根路由文件(urls.py
)中定义路由
python
path(router,view)
URL
地址为字母、数字、下划线、短横线的组合
如:
python
path('hello/',????)
第二步:定义(视图)函数
python
def function_name(request):
...
...
如:
python
def hello(request):
print('Hello Django')
相对完整的示例代码如下:
python
# 函数
def hello(request):
print('Hello,Django')
# 路由
urlpatterns = [
# ....
#代表的是当通过 http://127.0.0.1:8000/hello/访问时,将调用hello函数
path('hello/',hello),
]
运行结果如下:
此时产生错误的原因是:(视图)函数没有返回响应对象
在Django.http
包中提供了HttpResponse
类,它用于完成Http
响应,所以:
python
from django.http import HttpResponse
# 函数
def hello(request):
return HttpResponse('Hello,Django')
此时的运行结果如下:
第三步:通过链接或表单的action
来访问相关的路由
此时产生了另外的两个问题:
第一:如果来访问http://127.0.0.1:8000
时将产生404
错误 -- 怎么解决?
第二:现在在urls.py
中既有路由又有视图函数 -- 不便于管理 -- 如何便捷管理?
3.2 定义首页的路由
python
path('',视图函数)
示例代码
python
from django.http import HttpResponse
def index(request):
return HttpResponse('Index Page')
urlpatterns = [
# 首页路由
path('',index),
]
3.3 便捷管理路由及视图函数
为了便于管理视图函数,强烈建议将视图函数存储到views.py
中,然后再在urls.py
中引用该模块即可
urls.py
的示例代码如下:
python
from django.contrib import admin
from django.urls import path
from . import views
urlpatterns = [
path('admin/', admin.site.urls),
path('', views.index),
path('hello/', views.hello),
]
views.py
的示例代码如下:
python
from django.http import HttpResponse
def hello(request):
return HttpResponse('Hello Django')
def index(request):
return HttpResponse('Index Page')
对于静态的路由可以直接按需要进行定义,但是对于动态的路由,如访问某一个文章时的ID
,此时如何定义?
3.4 路径转换器
路径转换器主要解决动态路由的问题,如:
tex
http://127.0.0.1:8000/user/<id>
路径转换器的基本语法:
python
path("<类型:参数名称>/<类型:参数名称>",视图函数)
需要注意的是:在定义视图函数时,如果路由中存在路径转换器,那么视图函数也必须存在相同名称的参数
3.4.1 int
int
类型的路径转换器自动匹配正整数,类型为int
,如:
python
path("users/<int:id>",views.userinfo),
userinfo
的函数代码示例如下:
python
def userinfo(request,id):
...
....
3.4.2 str
str
类型的路径转换器自动匹配字符串,/
除外,类型为str
,如:
python
path("topic/<str:topic>/",views.topic),
3.4.3 slug
slug
匹配任意由字母、数字、短横线与下划线组成的字符,其类型为str
,如:
python
path('blog/<slug:title>',views.blog),
3.4.4 uuid
UUID
的格式为8-4-4-4-12
的十六位进制数字组成,其类型为uuid
Python
的uuid
模块
pythonimport uuid # 基于当前服务器ID和时间 uuid.uuid1() # 基于随机数 uuid.uuid4()
3.4.5 path
path
匹配路径,包括/
python
path('download/<path:path>/',views.download),
组合使用的案例
python
path('carts/<str:username>/id/<int:id>/',views.carts),
path('<str:username>/<int:id>/',views.goods),
四、模块
每个Django
项目至少存在一个模块(应用程序)
4.1 创建模块
shell
$ python3 manage.py startapp app_name
如:
shell
$ python3 manage.py startapp users
$ python3 manage.py startapp goods
4.2 注册模块
将创建的模块名称添加到配置文件的INSTALLED_APPS
列表中,如:
python
INSTALLED_APPS = [
# ...
'goods',
'users',
]
4.3 分布式路由
所谓的分布式路由是将某个模块下以共同字符串开头的路由写在根路由文件中,不同的部分写在模块内部的urls.py
中,当访问时系统将自动把两个部分的URL
进行拼接。
include()
函数位于django.urls
模块内,其作用是将当前路由与指定包含文件的路由进行拼接
python
include("URLS文件")
python
# urls.py最简陋的样子
from django.urls import path
from . import views
urlpatterns = [
path('',views.index),
]
python
# views.py最简陋的样子
def index(request):
...
...
unit02
一、DTL
1.1 什么是DTL?
DTL(Django Templates Language)
,Django
模板语言,实际上就是将HTML
页面与程序代码进行混合的技术。
1.2 模板配置
python
#模板配置
TEMPLATES = [
{
# 模板的引擎
'BACKEND': 'django.template.backends.django.DjangoTemplates',
# 配置模板文件的路径
'DIRS': [BASE_DIR / 'templates'],
# 是否查找模块下的目录
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
1.3 render()
函数
render()
函数位于django.shortcuts
模板内:
python
from django.shortcuts import render
render()
函数的语法结构为:
python
render(request,template_name,context=None)
request
代表的HttpRequest
对象
template_name
指要渲染的模板文件路径及名称
context
指要传递到模板的数据,其类型必须为dict
二、DTL
模板文件内可以使用:注释、变量、标签等
2.1 变量
html
# 变量
{{ variable_name }}
# 列表或元组
{{ variable_name.index }}
# 字典
{{ variable_name.key }}
#对象属性
{{ variable_name.property }}
#对象方法
{{ varible_name.method s}}
2.2 标签
标签是指模板中进行逻辑控制的代码,如分支结构、循环结构等,标签的基本语法结构为:
html
{% 标签名称 %}
或者
{% 开始标签名称 %}
...
...
{% 结束标签名称%}
2.2.1 for
标签
html
{% for variable in iterable %}
...
...
{% endfor %}
html
{% for variable in iterable %}
...
...
{% empty %}
...
...
{% endfor %}
在DTL
中为循环提供了在其内部使用的变量:
变量 | 描述 |
---|---|
forloop.counter |
正向循环计数器,从1开始 |
forloop.counter0 |
正向循环计数器,从0开始 |
forloop.revcounter |
反向循环计数器,从1开始 |
forloop.revcounter0 |
反向循环计数器,从0开始 |
forloop.first |
当前循环为第一次循环时为True |
forloop.last |
当前循环为最后一次循环时为True |
2.2.2 if
标签
html
{% if condition %}
...
{% endif %}
{% if condition %}
...
{% else %}
...
{% endif %}
{% if condition %}
...
{% elif condition %}
...
{% elif condition %}
...
{% else %}
...
{% endif %}
2.2.3 表单
1.表单的action
属性值为空或者省略action
属性,代表表单将提交给自身
2.表单的method
属性值为空或者省略method
属性,代表表单的提交方式为get
2.2.4 csrf_token
html
{% csrf_token %}
在以post
方式提交的表单内必须在使用{% csrf_token %}
产生令牌
当在表单内添加{% csrf_token %}
标签后将产生个名称为csrfmiddlewaretoken
的隐藏域
html
<input type="hidden" name="csrfmiddlewaretoken" value="7erwqas">
2.2.5 静态资源
静态资源是网站用于布局的样式文件、图片文件及脚本文件。
2.2.5.1 静态资源的配置
python
# 静态文件的路由
STATIC_URL = '/static/'
# 静态文件的位置
STATICFILES_DIRS = [
BASE_DIR / 'static'
]
2.2.5.2 访问静态资源
第一步:通过{% load static %}
标签加载static
标签
html
{% load static %}
第二步:在模板文件中通过static
标签来访问静态资源
html
{% static '静态文件的的路径及名称' %}
被静态文件引用的文件(如在CSS
文件内引用图片),因为该静态文件没有经过模板引擎处理,所以不能使用{% static %}
标签来加载 -- 只能通过其相对路径实现
unit03
一、DTL
1.1 标签
include
标签
include
标签用于在一个模板文件中包含另外一个模板文件,语法结构为:
html
{% include '被包含的模板文件的位置及名称' with variable=value variable=value %}
cycle
标签
当每次遇到cycle
标签时都会产生一个值,第一次产生第一个值,第二个产生第二值,依次类推。当值用尽时,再次遇到该标签时,就产生第一个值。
html
{% cycle 'value1' 'value2' 'value3' ... %}
注释
{# 这是一个单行注释 #}
{% comment %}
第一行
第二行
{% endcomment%}
1.2 过滤器
过滤器用于转换变量或标签参数的值,其基本语法结构为:
html
{{ 变量名称|过滤器:参数:参数 }}
safe
当通过变量向模板文件传递HTML
内容时,在模板中将把HTML
内容中的特殊符号进行替换操作,如>
替换为>
,<
替换为<
。
之所以进行替换的原因是为了防止XSS(Cross-site scripting)
攻击(译为跨站脚本攻击)。举例说明:
假设在某个网站中对于某条新闻发表了评论,内容如下:
txt
这篇新闻很好
<script>
while(true){
window.alert("哈哈哈");
}
</script>
当用户发表该评论后,其内容将写入到服务器的数据库 --- 不会产生任何问题
但是,如果该评论被某个用户通过浏览器进行访问时,那么其中的
txt
<script>
while(true){
window.alert("哈哈哈");
}
</script>
将被浏览器认为是JavaScript
脚本 - - 并且为死循环!!!
如何解决 -- 将输入的>
、<
等替换为对于HTML
实体,如果此时再有用户输入以下评论:
html
这篇新闻很好
<script>
while(true){
window.alert("哈哈哈");
}
</script>
将输入的>
、<
等替换为对于HTML
实体的结果为:
html
这篇新闻很好
<script>
while(true){
window.alert("哈哈哈");
}
</script>
在Django
模板中如果认为传递到模板的HTML
内容为安全内容,则需要通过safe
过滤器
striptags
striptags
过滤器用于去掉所有的HTML
标记
truncatechars
truncatechars
过滤器用于截断字符串并且指定长度
floatformat
floatformat
过滤器用于对浮点数进行四舍五入
date
date
过滤器用于格式化日期和时间
格式 | 描述 |
---|---|
Y |
年 |
m |
月,带有前导零 |
d |
日,带有前导零 |
H |
小时,带有前导零 |
i |
分钟,带有前导零 |
s |
秒,带有前导零 |
yesno
将True,False,None(可选)
的值映射到以逗号分隔的字符串
join
join
过滤器使用指定的分隔符将列表成员连接成字符串
二、Http
请求
当一个url
被请求时,Django
会自动创建HttpRequest
对象,在该对象内包含的请求的元数据,然后再加载相应的视图函数,并且将HttpRequest
对象作为视图函数的第一个参数
python
# 当前request参数代表的就是HttpRequest对象
def function_name(request):
...
...
HttpRequest
对象存在的属性除非另有说明外都是只读属性
3.1 属性
method
属性
method
属性用于获取HTTP
的请求方式,返回结果为英文大写字母
python
str HttpRequest.method
POST
属性
HttpRequest
对象的POST
属性将返回django.http.request.QueryDict
的对象,包含HTTP POST
提交的数据,其语法结构为:
python
QueryDict HttpRequest.POST
GET
属性
HttpRequest
对象的GET
属性将返回django.http.request.QueryDict
的对象,包含HTTP GET
提交的数据,其语法结构为:
python
QueryDict HttpRequest.GET
具有浏览框的表单的限制
A.表单的提交方式只能为POST
B.必须设置表单的enctype="multipart/form-data"
属性
html
<form method="post" enctype="multipart/form-data">
...
...
</form>
FILES
属性
FILES
属性返回django.utils.datastructures.MultiValueDict
对象
对于上传的文件超过2.5MB
将返回TemporaryUploadedFile
对象,否则返回InMemoryUploadedFile
对象,它们都继承自UploadedFile
对象,而UploadedFile
继承自File
对象,所以可以访问File
对象的name
、size
等属性
3.2 QueryDict
对象
QueryDict
对象继承自django.utils.datastructures.MultlValuDict
对象,MultiValue
对象的方法有:
get()
用于获取指定key
的值,否则返回default
python
MultiValue.get(key,default=None)
getlist()
用于获取指定key
的值,否则返回default
python
list MultiValue.getlist(key,default=None)
keys()
返回由键名组成的列表
python
list MultiValue.keys()
values()
返回由键值组成的列表
python
list MultiValue.value()
items()
dict()
返回由键名和键值组成的字典
python
dict MultiValue.dict()
unit04
一、HTTP
响应
每一个视图函数必须存在一个响应对象。
render()
函数返回是HttpResponse
对象,它的基本原理是将传递的模板文件与字典数据进进行混合后返回一个字符串的结果,该结果带入到HttpResponse
对象的参数中。
HttpReponse
对象位于django.http
模板内
python
from django.http import HttpResponse
其构造函数的结构为:
python
HttpResponse(content,content_type='text/html')
其中
content
代表的是响应的字符串信息
content_type
代表的响应的类型,默认为text/html
常用的响应类型有
响应类型 | 说明 |
---|---|
text/plain |
文本 |
text/html |
HTML |
text/css |
CSS |
text/javascript 、application/javascript |
JS |
application/json |
JSON |
JsonResponse
对象
JsonResponse
对象继承自HttpResponse
对象,其作用是返回JSON
响应,语法结构为:
python
#默认情况下,只能为字典对象转换为JSON格式的字符串
#对于非字典数据(列表数据)必须将safe参数设置为False
JsonResponse(data,safe=True)
二、模型
2.1 概述
模型 (Model
)是Django
为了构建和操纵数据库而提供的抽象层。
模型用于表示和操纵数据表及其记录。
所以首先通过MySQL
客户端创建数据库,如:
mysql
CREATE DATABASE IF NOT EXISTS knowbase;
SHOW DATABASES;
2.2 配置
python
DATABASES = {
'default': {
# 数据库引擎的类型
'ENGINE': 'django.db.backends.mysql',
# MySQL数据库服务器的地址
'HOST':'127.0.0.1',
# MySQL数据库服务器的端口号
'PORT':3306,
# MySQL数据库服务器用户的用户名
'USER':'root',
# MySQL数据库服务器用户的密码
'PASSWORD':'123456',
# MySQL数据库服务器的数据库名称
'NAME': 'knowbase',
}
}
2.3 创建模型
模型需要在模块下的models.py
文件中进行定义,所有的模型都必须继承自django.db.models.Model
类,结构如下:
python
class ClassName(models.Model):
field_name = models.数据类型([选项[,...]])
...
...
2.4 数据类型
数据类型 | 描述 |
---|---|
CharField(max_length=长度) |
VARCHAR |
SmallIntegerField() |
SMALLINT |
PositiveSmallIntegerField() |
SMALLINT UNSIGNED |
IntegerField() |
INT |
PositiveIntegerField() |
INT UNSIGNED |
BigIntegerField() |
BIGINT |
PositiveBigIntegerField() |
BIGINT UNSIGNED |
BooleanField |
TINYINT(1) |
FloatField(max_digits=数字总长度,decimal_places=小数点后的数字长度) |
FLOAT(M,D) |
DecimalField(max_digits=数字总长度,decimal_places=小数点后的数字长度) ) |
DOUBLE(M,D) |
TextField() |
LONGTEXT |
DateField() |
DATE |
TimeField() |
TIME |
DateTimeField(auto_now_add=是否自动记录创建时间,auto_now=是否自动记录修改时间) |
DATETIME |
2.5 数据迁移
第一步:生成移迁文件
shell
$ python3 manage.py makemigrations
第二步:数据迁移
shell
$ python3 manage.py migrate
add
过滤器用于进行字符串的拼接,如
html{{ username|add:'ABC'}} <!--假定username变量的值为Tom,那么拼接完的结果为 TomABC -->
三、管理器
在Django
的模型中要实现数据表中记录的管理是通过管理器来实现的
Django
为每个模型提供了一个名称为objects
的管理器,它作为模型的属性进行访问
python
模型类.objects
如:
python
from .models import Book
print(type(Book.objects))
all()
方法
all()
方法用于返回管理器的全部对象,其语法结构为:
python
QuerySet Manager.all()
get()
方法
get()
方法用于获取单个对象,如果没有符合条件的记录或者可以查询到多个记录都会产生异常
python
Object Manager.get(condition[,....])
如果以主键字段进行查找的话,可以写为
pythonBook.objects.get(id=5) # 或者 Book.objects.get(pk=5)
四、QuerySet
QuerySet
称为查询集或者查询结果集,用于表示与管理器相关查询结果。
Queryset
可以进行切片、复制及过滤等操作
all()
方法
all()
方法用于返回结果集中的全部对象,其语法结构为:
python
QuerySet QuerySet.all()
get()
get()
方法用于获取单个对象,如果没有符合条件的记录或者可以查询到多个记录都会产生异常
python
Object QuerySet.get(condition[,...])
filter()
filter()
方法用于根据指定的条件对结果集进行过滤,返回一个新的结果集
python
QuerySet QuerySet.filter(字段名称__查询谓语=值[,...])
first()
first()
方法用于返回结果集中的第一条记录
python
object QuerySet.first()
last()
last()
方法用于返回结果集中的最后一条记录
python
object QuerySet.last()
order_by()
order_by()
方法用于对结果集进行排序
python
QuerySet QuerySet.order_by('字段名称'[,....])
降序排列时,字段名称的写法为-字段名称
查询谓语
exact
,相等(区分大小写),可以在使用时直接用=
进行操作iexact
,相等,不区分大小写gt
,大于gte
,大于等于lt
,小于lte
,小于等于in
,在指定值内,字段名称__in=(value,value,vlaue,..)
range
,区间范围同,字段名称__range=(min,max)
contains
,包含指定的字符,区分大小写icontains
,包含指定的字符,不区分大小写startswith
,以指定字符开头,区分大小写istartswith
,以指定字符开头,不区分大小写endswith
,以指定字符结尾,区分大小写iendwith
,以指定字符结尾,不区分大小写
F
函数
python
from django.db.models import F
在查询时使用到某表内的字段时,必须通过F
函数将其引用
python
Book.objects.filter(sale_price__gte=200+F('cost_price'))
unit05
一、模型
values()
values()
方法用于限制返回的字段,可迭代对象为字典
python
QuerySet QuerySet.values(*fields)
结果样式如:
python
<QuerySet [{'id': 1}, {'id': 2}]>
values_list()
values_list()
方法用于限制返回的字段,可迭代对象为元组
python
QuerySet QuerySet.values_list(*fields)
结果样式如:
python
<QuerySet [(1,), (2,)]>
only()
only()
方法用于限制返回的字段,可迭代对象为模型实例
python
QuerySet QuerySet.only(*fields)
结果样式如:
python
<QuerySet [<Book: Book object (1)>, <Book: Book object (2)>]>
query
query
属性返回当前查询结果集对应的SQL
语句
python
str QuerySet.query
Q
函数
Q
函数用于对查询表达式进行连接,然后进行逻辑运算
python
from django.db.models import Q
exclude()
exclude()
方法返回不符合指定条件的记录
python
Queryset QuerySet.exclude(条件表达式)
count()
count()
方法用于获取结果集包含的记录总数
python
int QuerySet.count()
aggregate()
聚合函数有Count
、Max
、Min
、Sum
和Avg,
位于
python
from django.db.models import Count,Sum,Avg,Max,Min
python
dict QuerySet.aggregate(key=Count('field_name'))
dict QuerySet.aggregate(key=Max('field_name'))
dict QuerySet.aggregate(key=Min('field_name'))
dict QuerySet.aggregate(key=Sum('field_name'))
dict QuerySet.aggregate(key=Avg('field_name'))
annotate
aggregate()
方法用于对整个Queryset
进行聚合操作,而annotate()
方法用于对特定的字段进行聚合
python
Queryset QuerySet.annotate(key=Count('field_name'))
Queryset QuerySet.annotate(key=Max('field_name'))
Queryset QuerySet.annotate(key=Min('field_name'))
Queryset QuerySet.annotate(key=Sum('field_name'))
Queryset QuerySet.annotate(key=Avg('field_name'))
unit 06
一、HttpRequest
对象
path
属性
path
属性用于获取请求URL
python
str HttpRequest.path
get_full_path()
方法
get_full_path()
方法用于获取请求URL
及查询字符串
python
str HttpRequest.get_full_path()
redirect()
函数
redirect()
函数用于跳转到其他URL
python
from django.shortcuts import redirect
redirect(to)