Djingo官网:www.djangoproject.com
Django中文文档参考网站:yiyibooks.cn
本学习版本为2.2.12
参考学习视频:哔哩哔哩——达内教育
支持Python的版本: 3.5,3.6, 3.7,3.8
安装命令:sudo pip3 install django==2.2.12
**sudo pip3 install freeze|grep -i 'Django'**
终端创建项目命令:django-admin startproject 【项目名】
pycharm创建项目:file–>new projedct–>Django–>配置项目名称和路径–>点击创建
ctrl+c 关闭
sudo lsof -i :8000查询出Django的进程id
然后kill -9对应Django进程id
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uXqtz2ng-1646282935982)(C:\Users\luck\Desktop\2022-01-15 15-39-07屏幕截图.png)]
manage.py [项目管理的子命令]
输入python3 manage.py 可以查看所有命令
hsx_dome[项目同名文件夹]
init : Python包初始文件
wsgi.py :web服务网关的配置文件——Django正式启动需要用到
urls.py :项目的主要路由配置——http请求进去Django优先调用该文件
settings.py :项目的配置文件——包含项目启动时需要的配置
1、BASE _ DIR
2、DEBUG
3、ALLOWED _Н oSTS
4、 INSTALLED APPS ﹣指定当前项目中安装的应用列表。 MIDDLEWARE ﹣用于注册中间件
5、TEMPLATES ﹣用于指定模板的配置信息
6、DATABASES ﹣用于指定数据库的配置信息
7、LANGUAGECODE ﹣用于指定语言配置
settings . py 中也可以添加开发人员自定义的配置
配置建议:名字尽量个性化﹣以防覆盖掉公有配置
例如:Á LIPAY _ KEY )=’ xXxxxx
settings . py 中的所有配置项,都可以按需的在代码中引入
引入方式: from django . conf import settings
1、定义﹣即统一资源定位符 Uniform Resource Locator
2、作用﹣用来表示互联网上某个资源的地址
3、URL 的一般语法格式为(注:0代表其中的内容可省略):
protocol / hostname [: port ]/ path [? query] [# fragment ]
例子:http://tts.tmooc.cn/video/showVideo?menuld=657421& version =AID999# subject
protocol (协议)http://tts.tmooc.cn
hostname (主机名)http://tts.tmooc.cn
port (端口号)http://tts.tmooc.cn:80
path (路由地址)http://tts.tmooc.cn/video/showVideo
query (查询)****/ video/showVideo?menuld=657421&version=AlD999
fragment (信息片断) version =AID999# subject
Django从配置文件中根据 ROOT URLCONF 找到主路由文件;
默认情况下,该文件在项目同名目录下的urls ;
Django 加载主路由文件中的 urlpatterns 变量[包含很多路由的数组]
依次匹配 urlpatterns 中的 path ,匹配到第一个合适的中断后续匹配
匹配成功﹣调用对应的视图函数处理请求,返回响应
匹配失败﹣返回404响应
视图函数是用于接收一个浏览器请求( HttpRequest 对象)并通过 HttpResponse 对象返回响应的函数。此函数可以接收浏览器请求并根据业务逻辑返回相应的响应内容给浏览器
语法
def xxx _ view ( request [,其它参数…]):
return HttpResponse 对象
导入:from django.urls import path
语法:path(route,views,name=None)
参数:
route | 字符串类型,匹配的请求路径 |
---|---|
views | 指定路径所对应的视图处理函数的名称 |
name | 为地址起别名,在模板中地址反向解析时使用 |
<转换类型:自定义名>
path('page/',views.xxxx)
转换器类型 | 作用 | 样例 |
---|---|---|
str | 匹配除"/"之外的非空字符串 | "v1/users/< str : username> " 匹配 "/v1/users/ guoxiaonaol " |
int | 匹配0或任何正整数 | 返回一个 " page /< int : page >"匹配 / page /100 |
slug | 匹配任意由 ASCIl 字母或数字以及连字符和下划线组成的短标签 | " detail /< slug : sl >"匹配 / detail / this - is - django |
path | 匹配非空字段,包括路径分隔符 | "v1/users/< path : ph >" 匹配/v1/goods/ a / b / c |
作用:在url的匹配过程中可以使用正则表达式进行精确匹配
导入:from django.urls import path
语法:
re_path(reg,views,name=None)
正则表达式为命名分组模式(?P
方法 | 描述 |
---|---|
get | 请求指定的页面信息,并返回实体主体 |
head | 类似于get请求,只不过返回的响应中没有具体的内容,用于获取报头 |
post | 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。post请求可能会导致新的资源的建立和/或已有资源的修改 |
put | 从客户端向服务器传送的数据取代指定的文档的内容 |
delete | 请求服务器删除指定的页面 |
connect | HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器 |
option | 允许客户端查看服务器的性能 |
trace | 回显服务器收到的请求,用于测试或诊断 |
格式:
HttpResponse(content =响应体 Content_Type =响应体数据类型 status=状态码)
Content_Type:
HttpResponse 子类
类型 | 作用 | 状态码 |
---|---|---|
HttpResponseRedirect | 重定向 | 302 |
HttpResponseNotModified | 未修改 | 304 |
HttpResponseBadRequest | 错误请求 | 400 |
HttpResponseNotFound | 没有对应的资源 | 404 |
HttpResponseForbidden | 请求被禁止 | 403 |
HttpResponseServerError | 服务器错误 | 500 |
无论是GET还是POST,统一都有视图函数接收请求,通过判断request.method区分具体的请求动作
样例
if request.method=='GET':
#处理GET请求的业务逻辑
elif request.method=='POST':
#处理POST请求的业务逻辑
else:、
#处理其他请求的业务逻辑
GET请求动作,一般用于向服务器获取数据
产生GET请求的场景:
GET请求方式中,如果有数据需要传递给服务器,通常会用查询字符串(Query String)传递
方法示例:
request.GET['键']#直接获取URL地址存在键的值
request.GET.get('键','默认值')#直接获取URL地址存在键的值,也可获取URL地址上不存在键,并赋默认值给他
requset.GET.getlist('键')
<form method='post' action="/login/">
姓名:<input type="text" name="username">
<input type='submit' value='登录'>
form>
if request.method=='POST':
#处理POST请求的数据及响应
else:
#处理其他请求的数据及响应
request.POST['键']#直接获取URL地址存在键的值
request.POST.get('键','默认值')#直接获取URL地址存在键的值,也可获取URL地址上不存在键,并赋默认值给他
requset.POST.getlist('键')
注意:取消csrf验证,否则Django将会拒绝客户端发来的POST请求,报403响应
取消csrf验证:禁止掉settings.py中MIDDLEWARE中的CsrfViewsMiddleWare的中间件
MIDDLEWARE = [
.....
#'django.middleware.csrf.CsrfViewMiddleware',
.....
]
MVC代表Model-View-Controller(模型-视图-控制器)模式
作用:降低模块间的耦合度
MTV代表Model-Template-View(模型-模板-视图)模式
作用:降低模块间的耦合度
创建模板文件夹<项目名>/templates
在setting.py中TEMPLATES配置项
BACKEND:指定模板的引擎
DIRS:模板的搜索目录(可以是一个或者多个)
APP_DIRS:是否要在应用中的templates文件夹中搜索模板文件
OPTIONS:有关模板的选项
配置中需要修改的部分:
'DIRS': [os.path.join(BASE_DIR,'templates')],
通过loader获取模板,通过HttpResponse进行响应
在视图函数中
from django.template import loader
#1、通过loader加载模板
t=loader.get_template('模板文件名')
#2、将t转换为HTML字符串
html=t.render(字典数据)
#3、用响应对象将转换的字符串内容返回给浏览器
return HttpResponse(html)
使用render()直接加载并响应模板
在试图函数中
from django.shortcuts import render
return render(request.'模板文件名',字典数据)
视图函数中可以将Python变量封装到字典中传递到模板
def xxx_view(request):`
dic={`
`"变量1":"值1",`
`"变量2":"值2"`
}`
return render(request.'模板文件名',dic)`
模板中,我们可以用{{变量名}}的语法调用视图传进来的变量
能传递到模板中的数据类型:
字符串、整型、数组、元组、字典、方法、类实例化对象
在模板中使用变量语法:
{{变量名.index}}获取索引对应的值
{{变量名.key}}获取字典对应的值
{{对象.方法}}可以直接调用对象的方法
{{函数名}}可以调用函数
作用:将一些服务器端的功能嵌入到模板中,例如流程控制等
标签语法:
{%标签%}
.......
{%结束标签%}
语法:
{%if 条件表达式1 %}
......
{%elif 条件表达式2 %}
......
{%elif 条件表达式3 %}
......
{% else %}
......
{% endif %}
{% for 变量 in 可迭代对象 %}
....循环语句
{% empty %}
....可迭代对象无数据填充的语句
{% endfor %}
内置变量-forloop
变量 | 描述 |
---|---|
forloop.counter | 循环的当前迭代(从1开始索引) |
forloop.counter0 | 循环的当前迭代(从0开始索引) |
forloop.revcounter | counter值倒序 |
forloop.revcounter0 | revcounter值倒序 |
forloop.first | 如果这是第一次通过循环,则为真 |
forloop.last | 如果这是最后一次循环,则为假 |
forloop.parentloop | 当嵌套循环,parentloop表示外层循环 |
**定义:**在变量输出时对变量的值进行处理
**作用:**可以通过使用过滤器来改变变量的输出显示
语法:{{变量|过滤器1:‘参数值1’|过滤器2:‘参数值2’…}}
常用过滤器:
过滤器 | 说明 |
---|---|
lower | 将字符串转换为全部小写 |
upper | 将字符串转换为全部大写 |
safe | 默认不对变量内的字符串进行html转义 |
add:“n” | 将value的值增加n |
truncatechars:“n” | 如果字符串字符多于指定的字符数量,那么会截断。截断的字符将以可翻译的省略号序列结尾 |
模板继承可以使父模板的内容重用,子模板直接继承父模板的全部内容并可以覆盖父模板中相应的块
语法﹣父模板中:
语法﹣子模板中:
继承模板 extends 标签(写在模板文件的第一行)
例如{% extends 'base . html‘ %}
子模板重写父模板中的内容块
{% block b1ock_ name %}
子模板块用来覆盖父模板中 block _ name 块的内容
{% endb1ock b1ock_name %}
重写的覆盖规则
注意
url 反向解析是指在视图或模板中,用 path 定义的名称来动态查找或计算出相应的路由
path 函数的语法
根据 path 中的 name =关键字传参给 url 确定了个唯一确定的名字,在模板或视图中,可以通过这个名字
反向推断出此 url 信息
通过 url 标签实现地址的反向解析
{% ur1 ‘别名’%}
{% url '别名' '参数值1' '参数值2'%}
可调用 django 中的 reverse 方法进行反向解析
from django . urls import reverse
reverse ('别名', args =[], kwargs ={})
静态文件配置﹣ settings . py 中
配置静态文件的访问路径【该配置默认存在】
通过哪个 url 地址找静态文件
STATIC _ URL =’/ static /’
说明:
指定访问静态文件时是需要通过/static/xxx 或http://127.0.0.1:8000/static/xxx
[ xxx 表示具体的静态资源位置]
配置静态文件的存储路径 STATICELLES DIRS
STATICFILES _ DIRS 保存的是静态文件在服务器端的存储位置
#file:setting.py
STATICFILES_DIRS =(
os.path .join(BASE_DIR ,"static"),
)
通过 {% static %}标签访问静态文件
<img src="{% static 'images/lena.jpg'%}">
介绍:
应用在 Django 项目中是一个独立的业务模块,可以包含自己的路
由,视图,模板,模型
创建应用
用 manage . py 中的子命令 startapp 创建应用文件夹
python3 manage . py startapp 【自定义文件名】
在 settings . py 的 INSTALLED _ APPS 列表中配置安装此应用
配置分布式路由
步骤一、主路由中调用 include 函数
语法: include (’ app 名字. url 模块名)
作用:用于将当前路由转到各个应用的路由配置文件的 urlpatterns 进行分布式处理
from django.contrib import admin
from django.urls import path,include
from hsx_Django2 import views
urlpatterns = [
path('admin/', admin.site.urls),
path("test_static",views.test_static),
path('music/',include('music.urls')),
path('sport/',include('sport.urls')),
path('news/',include('news.urls'))
]
步骤2、应用下配置 urls . py
应用下手动创建 urls . py 文件
内容结构同主路由完全一样
from django.urls import path
from .import views
urlpatterns = [
path('index',views.index_view)
]
应用内部可以配置模板目录
应用下手动创建 templates 文件夹
settings . py 中开启应用模板功能
TEMPLATE 配置项中的' APP _ DIRS '值为 True 即可
应用下 templates 和外层 templates 都存在时, django 得查找模板规则
定义:负责跟数据库之间进行通信
Django 配置 mysql (linux ubuntu)
sudo apt list --instaledlgrep -E 'libmysqlclient-dev|python3-dev ‘
sudo apt - get instal python3-dev default-libmysqlclient-dev
更改setting.py数据库配置项
#setting.py mysql数据库配置项
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME':'hsx_db',
'USER':"root",
'PASSWORD':'123456',
'HOST':"127.0.0.1",
"PORT":"3306"
}
}
ENGINE -指定数据库存储引擎
'django.db.backends.mysq1'
'django.db.backends.sq1ite39'
'django.db.backends. oracle'
'django.db.backends.postgresq1'
NAME ﹣指定要连接的数据库的名称
USER ﹣指定登录到数据库的用户名
PASSWORD ﹣数据库的密码
HOST / PORT ﹣连接具体数据库的 IP 和端口
模型
定义
作用
优点
只需要面向对象编程,不需要面向数据库编写代码.
实现了数据模型与数据库的解耦,屏蔽了不同数据库操作上的差异.
模型类-创建
from django.db import models
class 模型类名(models.Model):
字段名=models.字段类型(字段选项)
示例:
from django.db import models
#Book
class Book(models.Model):
#title和price是类属性,也等于数据库字段,CharField和DecimalField是字段类型
title=models.CharField('书名',max_length=50,default='')
price=models.DecimalField('定价',max_digits=7,decimal_places=2,default=0.0)
迁移是 Django 同步您对模型所做更改(添加字段,删除模型等)到您的数据库模式的方式
生成迁移文件-执行
将应用下的 models . py 文件生成一个中间文件,并保存在 migrations 文件夹中
执行迁移脚本程序﹣执行
执行迁移程序实现迁移。将每个应用下的 migrations 目录中的中间文件同步回数据库
BooleanField()
数据库类型: tinyint (1)
编程语言中:使用 True 或 False 来表示值
在数据库中:使用1或0来表示具体的值·
CharField
数据库类型: varchar
注意:必须要指定 max _ length 参数值
DateField ()
数据库类型: date
作用:表示日期
参数:
auto _ now :每次保存对象时,自动设置该字段为当前时间(取值: True / False )
auto _ now _ add :当对象第一次被创建时自动设置当前时间(取值: True / False )。
default :设置当前时间(取值:字符串格式时间如:'2019-6-1)。
以上三个参数只能多选一
DateTimeField()
数据库类型: datetime (6)
作用:表示日期和时间
参数同 DateField
FloatField()
数据库类型: double
编程语言中和数据库中都使用小数表示值
DecimalField()
数据库类型: decimal (×, y )
编程语言中:使用小数表示该列的值
在数据库中:使用小数
参数:
max _ digits :位数总数,包括小数点后的位数。该值必须大于等于 decimal _ places
decimal _ places :小数点后的数字数量
ImageField ()
数据库类型: varchar (100)
作用:在数据库中为了保存图片的路径
编程语言和数据库中使用字符串
TextField()
数据库类型: longtext
作用:表示不定长的字符数据
EmailField()
数据库类型 varchar
编程语言和数据库中使用字符串
IntegerField()
数据库类型: int
编程语言和数据库中使用整数
**字段选项:**指定创建的列的额外的信息
允许出现多个字段选项,多个选项之间使用,隔开
primary _ key
blank
null
如果设置为 True ,表示该列值允许为空。
默认为 False ,如果此选项为 False 建议加入 default 选项来设置默认值
default
db _ index
unique
db _ column
verbose _ name
字段选项样例
#创建一个属性,表示用户名称,长度30个字符,必须是唯一的,不能为空,添加索引
name=models.CharField (max_length =30,unique=True,nu11= False,db_index=Tru)
使用内部 Meta 类来给模型赋予属性, Meta 类下有很多内建的类属性,可对模型类做一些控制
示例:
#file : bookstore/models.py
from django.db import models
class Book (models.Model):
title=models.charField ("书名",max_length =50, default ='')
price=models.DecimalField ("定价",max_digits =7,decima1_p1aces=2,default=0.0)
clasS Meta :
db_table='book' #可改变当前模型类对应的表名
每个继承自 models . Model 的模型类,都会有一个 objects 对象被同样继承下来。这个对象叫管理器对象
数据库的增删改查可以通过模型的管理器实现
class MyMode1( models .Mode1):
.....
MyMode1.objects. create (...)# objects 是管理器对象
Django ORM 使用一种直观的方式把数据库表中的数据表示成
Python 对象
方案1
MyModel . objects . create (属性1=值1,属性2=值1…)
方案2
创建 MyModel 实例对象,并调用 save()进行保存
obj =MyMode1(属性=值,属性=值)
obj.属性=值
obj.save()
查询简介
方法 | 说明 |
---|---|
all() | 查询全部记录,返回 QuerySet 查询对象 |
get() | 查询符合条件的单一记录 |
filter() | 查询符合条件的多条记录 |
exclude() | 查询符合条件之外的全部记录 |
all()方法
用法:MyModel . objects . all()
**作用:**查询 MyModel 实体中所有的数据
等同于 select * from tabel
返回值:QuerySet 容器对象,内部存放 MyModel 实例
from bookstore . models import Book
books = Book . objects .a11O
for book in books :
print(book.title,book.pub)
values (`列1’,列2’.)
用法: MyModel . objects . values (…)
**作用:**查询部分列的数据并返回
等同于 select 列1,列2 from XXX
返回值: QuerySet
values _ list (列1,‘列2’)
用法: MyModel . objects . values _ list (…)
**作用:**返回元组形式的查询结果
等同于 select 列1,列2 from XXX
返回值: QuerySet 容器对象,内部存放元组
order _ by
用法: MyModel . objects . order _ by (`﹣列,列)
**作用:**与all()方法不同,它会用 SQL 语句的 ORDER BY 子句对查询结果进行根据某个字段选择性的进行 排序
说明:
默认是按照升序排序,降序排序则需要在列前增加’-'表示
filter (条件)
语法: MyModel . objects . filter (属性1=值1,属性2=值2)
**作用:**返回包含此条件的全部的数据集
返回值:
QuerySet 容器对象,内部存放 MyModel 实例
说明:
当多个属性在一起时为"与"关系,即当
get (条件)
语法: MyModel . objects . get (条件)
**作用:**返回满足条件的唯一一条数据
**说明:**该方法只能返回一条数据,查询结果多余一条数据则抛出出, Model . MultipleObjectsReturned 异常,查询结果如果没有数据则拋出 Model . DoesNotExist 异常
**定义:**做更灵活的条件查询时需要使用查询谓词
**说明:**每一个查询谓词是一个独立的查询功能
**_ exact :**等值匹配
示例:
Author.objects.filter(id_exact=1)
#等同于 select * from author where id =1
样例:Author.objects.filer(age_gt =50)
#等同于 select * from author where age >50
更新单个数据
修改单个实体的某些字段值的步骤:
批量更新数据
直接调用 QuerySet 的 update (属性=值)实现批量修改
示例:
#将 id 大于3的所有图书价格定为0元
books = Book.objects.filter (id__gt=3)
books.update(price=0)
#将所有书的零售价定为100元 books = Book . objects .all()
books.update(market_price=100)
单条数据删除
查找查询结果对应的一个数据对象
调用这个数据对象的delete()方法实现删除
try:
auth = Author.objects.get(id=1)
auth.delete()
except:
print(删除失败)
批量删除
查找查询结果集中满足条件的全部QuerySet查询集合对象
调用查询集合对象的delete()方法实现删除
#删除全部作者中,年龄大于65的全部信息
auths = Author.objects.filter(age_gt=65)
auths.delete()
伪删除
一个 F 对象代表数据库中某条记录的字段的信息
作用:
通常是对数据库中的字段值在不获取的情况下进行操作
用于类属性(字段)之间的比较。
语法
from django . db . models import F
F ('列名')
示例1:更新 Book 实例中所有的零售价涨10元
Book.objects.a11().update(market_price=F('market _ price')+10)
'UPDATE `bookstore_book` SET market_price=(`bookstore_book`,` market_price+10)
#以上做法好于如下代码
books=Book.objects.all()
for book in books:
book.market_price=book.marget_price +10
book.save()
示例2:对数据库中两个字段的值进行比较,列出哪儿些书的零售价高于定价?
from django.db.models import F
from bookstore.models import Book
books=Book.objects.filter(market_price__gt=F('price'))
SELECТ * FROМ `bookstore_book` WHERE `bookstore_book`,`marke_price`>(`bookstore_book `,`price`)
for book in books:
print (book.title ,‘定价:',book.price,‘现价:',book.market_price)
当在获取查询结果集使用复杂的逻辑或小逻辑非~等操作时可以借助于 Q 对象进行操作
**如:**想找出定价低于20元或清华大学出版社的全部书,可以写成
Book.objects.filter(Q(price_lt=20)|Q(pub ="清华大学出版社"))
Q 对象在数据包 django . db . models 中。需要先导入再使用
**作用:**在条件中用来实现除 and (&)以外的 or ( l )或 not (~)操作
运算符:
语法:
from django.db.models import Q
Q (条件1)|Q(条件2)#条件1成立或条件2成立
Q (条件1)&Q(条件2)#条件1和条件2同时成立
Q (条件1)&~Q(条件2)#条件1成立且条件2不成立
示例:
from django.db.models import Q
#查找清华大学出版社的书或价格低于50的书
Book.objects.filter(Q(market_price__lt =50)|Q(pub_house='清华大学出版社'))
#查找不是机械工业出版社的书且价格低于50的书
Book.objects.filter(Q(market_price_lt=50)&~Q(pub_house='机械工业出版社'))
聚合查询是指对一个数据表中的一个字段的数据进行部分或全部进行统计查询,查 bookstore _ book 数据表中的全部书的平均价格,查询所有书的总个数等,都要使用聚合查询
聚合查询分为:
整表聚合
分组聚合
不带分组的聚合查询是指导将全部数据进行集中统计查询
from django . db . models import *
Sum , Avg , Count , Max , Min
MyModel . objects . aggregate (结果变量名=聚合函数(列'))
分组聚合是指通过计算查询结果中每一个对象所关联的对象集合,从而得出总计值(也可以是平均值或总和),即为查询集的每一项生成聚合。**
语法:
QuerySet . annotate (结果变量名=聚合函数('列'))
返回值;
QuerySet
Django 也可以支持直接用 sqI 语句的方式通信数据库
books=models.Book.objects.raw('select * from bookstore_book')
for book in books :
print ( book )
使用原生语句时小心 SQL 注入
s1=Book.objects.raw(
select from bookstore _ book where id =% s '%(‘1 or 1=1’))
攻击结果:可查询出所有用户数据
完全跨过模型类操作数据库﹣查询/更新/删除
from django.db import connection
from django.db import connection
with connection.cursor() as cur :
cur.execute ('执行SQL 语句','拼接参数')
python manage.py createsuperuser
from .models import *
class BookManager(admin.ModelAdmin):
#列表页显示哪些字段的列
list_display = ['id','title','pub','price','market_price']
#控制List_display中的字段,哪有可以连接到修改页
list_display_links = ['title']
#添加过滤器
list_filter = ["pub"]
#添加搜索框[模糊查询]
search_fields = ['title']
#添加可更改的字段
list_editable = ['price']
admin.site.register(Book,BookManager)
在model.py文件
class Meta:
db_table='book'
#给模型对象的一个易于理解的名称(单数),用于显示在admin管理界面
verbose_name='图书'
#复数名称,用于显示在admin管理界面
verbose_name_plural=verbose_name
在关系型数据库中,通常不会把所有数据都放在同一张表中,不易于扩展
常见关系映射有:
一对一映射 如:一个身份证对应一个人
一对多映射 如:一个班级可以有多个学生
多对多映射 如:一个学生可以报多个课程,一个课程可以有多个学生学习
OneToOneField (类名,on_delete=xxx )
class Author(models.Model):
name=models.CharField('姓名',max_length=11)
class Wife(models.Model):
name=models.CharField('姓名',max_length=11)
author=models.OneToOneField(Author,on_delete=models.CASCADE)
models.CASCADE 级联删除。 Django 模拟 SQL 约束 ON DELETE CASCADE 的行为,并删除包含
ForeignKey 的对象。
models.PROTECТ抛出 ProtectedError 以阻止被引用对象的删除;[等同于 mysql默认的 RESTRICТ]
SET_NULL 设置 ForeignKey nul ;需要指定 nul=True
SET_DEFAULT 将 ForeignKey 设置为其默认值;必须设置 ForeignKey 的默认值
无外键的模型类[ Author ]:
author1= Author .objects.create ( name ='王老师')
有外键的模型类[ Wife ]
wife1= Wife.objects.create(name ='王夫人',author=author1)#关联王老师 obj
wife1= Wife.objects.create(name ='王夫人'author_id =1)#关联王老师对应主键值
1、正向查询:直接通过外键属性查询,则称为正向查询
#通过 wife 找 author
from.models import Wife
wife = Wife.objects.get(name='王夫人‘)
print ( wife.name ,‘的老公是’, wife.author.name )
2、反向查询﹣没有外键属性的一方,可以调用反向属性查询到关联的另一方
反向关联属性为实例对象.引用类名(小写),如作家的反向引用为作家对象.wife
----当反向引用不存在时,则会触发异常
author1= Author.objects.get (name ='王老师')
author1.wife.name
一对多是表示现实事物间存在的一对多的对应关系。
**如:**一个学校有多个班级,一个班级有多个学生,一本图书只能属于一个出版社,一个出版社允许出版多本图书
一对多需要明确出具体角色,在多表上设置外键
语法:当一个A类对象可以关联多个B类对象时
class A(models.Model):
.....
class Wife(models.Model):
属性=models.ForeignKey("一"的模型类,on_delete=xx)
ForeignKey必须指定on_delete模式
先创建’一’,在创建’多‘
from .models import *
pub1=Publisher.objects.create(name='清华大学出版社')
Book.objects.create(title='C++',publisher=author1)
Book.objects.create(title='Java',publisher_id=1)
1,正向查询[通过 Book 查询 Publisher ]
#通过pub1isher属性查询即可 book.publisher
abook = Book.objects.get(id =1)
print( abook.title ,'的出版社是:', abook.publisher.name )
2,反向查询[通过 Publisher 查询对应的所有的 Book ]
需要用到反向属性xxx_set
#通过出版社查询对应的书
pub1= Publisher.objects.get( name =‘清华大学出版社’)
books =pub1.book_set.a11()#通过book_set 获取pub1对应的多个 Book 数据对象
#books = Book.objects.filter(publisher =pub1)
#也可以采用此方式获取
print ('清华大学出版社的书有')
for book in books :
print ( book.title )
**多对多表达对象之间多对多复杂关系,**如:每个人都有不同的学校(小学,初中,高中,.…),每个学校都有
不同的学生…
属性=models.ManyToManyField ( MyModel )
用法示例:
class Author(models.Mode1):
....
class Book(models.Mode1):
....
authors=models.ManyToManyField ( Author )
#方案1先创建 author 再关联 book
author1= Author.objects.create(name ='吕老师')
author2= Author.objects.create(name ='王老师')
#吕老师和王老师同时写了一本 Python
book11=author1.book_set.create(titl ="Python")
author2book_set.add(book11)
#方案2先创建 book 再关联 author
book = Book.objects.create(title ='python1')
#郭小闹和吕老师都参与了python1的创作
author3= book.authors.create(name='guoxiaonao')
book.authors.add(author1)
1,正向查询有多对多属性的对象查另一方
book.authors.a11() ->获取 book 对应的所有的 author 的信息
book.authors.filter(age__gt=80) ->获取 book 对应的作者中年龄大于80岁的作者的信息
2,反向查询
通过 Author 查询对应的所有的 Book 利用反向属性 book _ set
author.book_set.a11()
author.book_set.filter()
Cookies和Session就是为了保持会话状态而诞生的两种存储技术**
HttpResponse.set_cookie( key,value =",max_age=None,expires=None)
添加 cookie
#为浏览器添加键为 my_var1,值为123,过期时间为1个小时的cookie
responds=HttpResponse("己添加 my _var1,值为123")
responds.set_cookie('my _var1',123,3600)
return responds
修改 cookie
#为浏觉器添加键为 my_var1,修改值为456,过期时间为2个小时的 cookie
responds=HttpResponse("已修改 my _var1,值为456")
responds.set_cookie ('my _var1',456,3600*2)
return responds
删除 Cookies
HttpResponse.delete_cookie(key)
获取 Cookies
value = request.COOKIES.get ('cookies名',‘默认值)
session 是在服务器上开辟一段空间用于保留浏览器和服务器交互时的重要数据
实现方式:
使用 session 需要在浏览器客户端启动 cookie ,且在 cookie 中存储 sessionid
每个客户端都可以在服务器端有一个独立的 Session ﹣注意:不同的请求者之间不会共享这个数据,与
请求者一一对应
settings . py 中配置 session
INSTALLED _ APPS =[
#启用 sessions 应用
'django.contrib.sessions',
]
MIDDLEWARE =[
#启用 session 中间件
'django.contrib.sessions.midd1eware.SessionMidd1eware'
]
session 对于象是一个类似于字典的 SessionStore 类型的对象,可以用类拟于字典的方式进行操作
session 能够存储如字符串,整型,字典,列表等。
request.session ['KEY']= VALUE
value = request.session['KEY']
value=request.session.get('KEY',默认值)
del request.session [' KEY ']
注意: Django 中的 session 数据存储在数据库中,所以使用 session 前需要确保已经执行过 migrate
django_session 表是单表设计;
且该表数据量持续增持【浏览器故意删掉 sessionid &过期数据未删除】
可以每晚执行python3 manage . py clearsessions
【该命令可删除已过期的 session 数据】
sponds.set_cookie (‘my _var1’,456,3600*2)
return responds
```
删除 Cookies
HttpResponse.delete_cookie(key)
获取 Cookies
value = request.COOKIES.get ('cookies名',‘默认值)
session 是在服务器上开辟一段空间用于保留浏览器和服务器交互时的重要数据
实现方式:
使用 session 需要在浏览器客户端启动 cookie ,且在 cookie 中存储 sessionid
每个客户端都可以在服务器端有一个独立的 Session ﹣注意:不同的请求者之间不会共享这个数据,与
请求者一一对应
settings . py 中配置 session
INSTALLED _ APPS =[
#启用 sessions 应用
'django.contrib.sessions',
]
MIDDLEWARE =[
#启用 session 中间件
'django.contrib.sessions.midd1eware.SessionMidd1eware'
]
session 对于象是一个类似于字典的 SessionStore 类型的对象,可以用类拟于字典的方式进行操作
session 能够存储如字符串,整型,字典,列表等。
request.session ['KEY']= VALUE
value = request.session['KEY']
value=request.session.get('KEY',默认值)
del request.session [' KEY ']
注意: Django 中的 session 数据存储在数据库中,所以使用 session 前需要确保已经执行过 migrate
django_session 表是单表设计;
且该表数据量持续增持【浏览器故意删掉 sessionid &过期数据未删除】
可以每晚执行python3 manage . py clearsessions
【该命令可删除已过期的 session 数据】