
Django 千鋒培訓(xùn)讀書筆記
https://www.bilibili.com/video/av17879644/?p=1
切換到創(chuàng)建項(xiàng)目的目錄 cd C:\Users\admin\Desktop\DjangoProject
創(chuàng)建名為project的項(xiàng)目命令 django-admin startproject project
注:所有路徑不要有中文
切換到目錄cd C:\Users\admin\Desktop\DjangoProject\project
目錄層級(jí)說(shuō)明:manage.py 一個(gè)命令行工具,可以讓我們用多種方式對(duì)Django項(xiàng)目進(jìn)行交互
__init__.py 一個(gè)空文件,它告訴Python這個(gè)目錄應(yīng)該被看做一個(gè)包
settings.py 項(xiàng)目的配置文件(主要處理文件)
urls.py 項(xiàng)目的url聲明 (主要處理文件)
wsgi.py 項(xiàng)目與WSGI兼容的Web服務(wù)器入口
配置數(shù)據(jù)庫(kù) Django默認(rèn)使用SQLite數(shù)據(jù)庫(kù)
在settings.py文件中通過(guò)DATABASES選項(xiàng)進(jìn)行數(shù)據(jù)庫(kù)配置
配置MySQL Python3.x中安裝的是PyMySQL
在__init__.py文件中寫入兩行代碼import pymysql
pymysql.install_as_MySQLdb()
以數(shù)據(jù)庫(kù)sunck為例進(jìn)行示范:對(duì)settings.py中的DATABASES進(jìn)行設(shè)置
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': "sunck",
'USER': "root",
'PASSWORD': "admin123",
'HOST': "localhost",
'PORT': "3306"
}
}
創(chuàng)建應(yīng)用--在一個(gè)項(xiàng)目中可以創(chuàng)建多個(gè)應(yīng)用,每個(gè)應(yīng)用進(jìn)行一種業(yè)務(wù)處理
打開(kāi)CMD,進(jìn)入project(目錄名)的目錄下,輸入命令創(chuàng)建名為myApp的app:
python manage.py startapp myAPP
myAPP目錄說(shuō)明
admin.py 進(jìn)行站點(diǎn)配置
models.py 創(chuàng)建模型
views.py 創(chuàng)建視圖
激活應(yīng)用 在settings.py文件中,將myApp應(yīng)用加入到INSTALLED_APPS選項(xiàng)中
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'myApp',
]
定義模型 概述:有一個(gè)數(shù)據(jù)表就對(duì)應(yīng)有一個(gè)模型
在models.py文件中定義模型
引入:from django.db import models
模型類要繼承models.Model類
示例:
class Grades(models.Model):
gname = models.CharField(max_length=20)
gdate = models.DateTimeField()
ggirlnum = models.IntegerField()
gboynum = models.IntegerField()
isDelete = models.BooleanField(default=False)
class Students(models.Model):
sname = models.CharField(max_length=20)
sgender = models.BooleanField(default=True)
sage = models.IntegerField()
scontend = models.CharField(max_length=20)
isDelete = models.BooleanField(default=False)
sgrade = models.ForeignKey("Grades", on_delete=models.CASCADE,)
說(shuō)明:
不需要定義主鍵,在生成時(shí)自動(dòng)添加,并且值為自動(dòng)增加
在數(shù)據(jù)庫(kù)中生成數(shù)據(jù)表
生成遷移文件
執(zhí)行 python manage.py makemigrations 在migrations目錄下生成一個(gè)遷移文件,此時(shí)數(shù)據(jù)庫(kù)中還沒(méi)有生成數(shù)據(jù)表
執(zhí)行遷移
執(zhí)行 python manage.py migrate 相當(dāng)于執(zhí)行MySQL語(yǔ)句創(chuàng)建了數(shù)據(jù)表
測(cè)試數(shù)據(jù)操作
進(jìn)入到python shell
執(zhí)行 python manage.py shell
引入包
from myApp.models import Grades, Students
from django.utils import timezone
from datetime import *
查詢所有數(shù)據(jù)
類名.objects.all()
示例: Grades.objects.all()
添加數(shù)據(jù)
本質(zhì):創(chuàng)建一個(gè)模型類的對(duì)象實(shí)例
示例:CMD窗口下:
grade1 = Grades()
grade1.gname = "python04"
grade1.gdate = datetime(year=2017, month=7, day=17)
grade1.ggirlnum = 3
grade1.gboynum = 70
grade1.save()
查看某個(gè)對(duì)象
類名.objects(pk=索引號(hào))
示例:
Grades.objects.get(pk=2)
Grades.objects.all()
修改某個(gè)數(shù)據(jù)
模型對(duì)象屬性 = 新值
示例:
grade2.gboynum = 60
grade2.save()
刪除數(shù)據(jù)
模型對(duì)象.delete()
grade2.delete()
注意:這是物理刪除,數(shù)據(jù)庫(kù)中的相應(yīng)數(shù)據(jù)被永久刪除
關(guān)聯(lián)對(duì)象
示例:
stu = Students()
stu.sname = "Xue Yanmei"
stu.sgender = False
stu.sage = 20
stu.scontend = "I am Xue Yanmei"
stu.sgrade = grade1
stu.save()
獲得關(guān)聯(lián)對(duì)象的集合
需求:獵取python04班級(jí)的所有學(xué)生
對(duì)象名.關(guān)聯(lián)的類名小寫_set.all()
示例:grade1.students_set.all()
需求:創(chuàng)建曾志偉,屬于python04班級(jí)
示例:
stu3 = grade1.students_set.create(sname=u'Zhen Zhiwei',sgender=True,scontend=u"I am Zhen Zhiwei",sage=45)
注意:這樣創(chuàng)建的數(shù)據(jù)直接被添加到了數(shù)據(jù)庫(kù)當(dāng)中。
啟動(dòng)服務(wù)器:
格式:python manage.py runserver ip:port
注意:ip可以不寫,不寫代表本機(jī)ip
端口號(hào)默認(rèn)是8000
python manage.py runserver
說(shuō)明:
這是一個(gè)純python編寫的輕量級(jí)web服務(wù)器,僅僅在開(kāi)發(fā)測(cè)試中使用這個(gè)
Admin站點(diǎn)管理:
概述:
內(nèi)容發(fā)布:負(fù)責(zé)添加,修改,刪除內(nèi)容的
公告訪問(wèn)
配置Admin應(yīng)用:
在settings.py文件中的INSTALLED_APPS中添加'django.contrib.admin',
這條默認(rèn)是添加好的。
創(chuàng)建管理員用戶:
在項(xiàng)目目錄下執(zhí)行 python manage.py createsuperuser
依次輸入賬號(hào)名,郵箱,密碼即可完成用戶創(chuàng)建
登陸:
http://127.0.0.1:8000/admin/
漢化:
把project\settings.py
中作如下設(shè)定:LANGUAGE_CODE = 'zh-Hans'
TIME_ZONE = 'Asia/Shanghai'
管理數(shù)據(jù)表:
修改 myAPP\admin.py 如下:
from django.contrib import admin
# Register your models here.
from .models import Grades, Students
# 注冊(cè)
admin.site.register(Grades)
admin.site.register(Students)
自定義管理頁(yè)面:
屬性說(shuō)明
# 列表頁(yè)屬性
list_display = [] # 顯示字段設(shè)置
list_filter = [] # 過(guò)濾字段設(shè)置
search_fields = [] # 搜索字段設(shè)置
list_per_page = [] # 分頁(yè)設(shè)置
# 添加,修改頁(yè)屬性
fields = [] # 規(guī)定屬性的先后順序
fieldsets = [] # 給屬性分組 注意:fields與fieldsets不能同時(shí)使用
屬性示例:
# 列表頁(yè)屬性
list_display = ['pk', 'gname', 'gdate', 'ggirlnum', 'gboynum', 'isDelete']
list_filter = ['gname']
search_fields = ['gname']
list_per_page = 5
# 添加,修改頁(yè)屬性
# fields = ['ggirlnum', 'gboynum', 'gname', 'gdate', 'isDelete']
fieldsets = [
("num",{"fields":['ggirlnum', 'gboynum']}),
("base", {"fields":["gname", "gdate", "isDelete"]}),
]
關(guān)聯(lián)對(duì)象:需求:在創(chuàng)建一個(gè)班級(jí)時(shí)可以直接添加幾個(gè)學(xué)生
class StudentsInfo(admin.TabularInline):# 可選參數(shù)admin.StackedInline
model = Students
extra = 2
class GradesAdmin(admin.ModelAdmin):
inlines = [StudentsInfo]
布爾值顯示問(wèn)題示例:
class StudentsAdmin(admin.ModelAdmin):
def gender(self):
if self.sgender:
return "男"
else:
return "女"
# 設(shè)置頁(yè)面列的名稱
gender.short_description = "性別"
list_display = ['pk', 'sname', 'sage', gender,
'scontend', 'sgrade', 'isDelete']
list_per_page = 10
admin.site.register(Students, StudentsAdmin)
執(zhí)行按鈕位置:
class StudentsAdmin(admin.ModelAdmin):
...snip...
actions_on_top = False
actions_on_bottom = True
admin.site.register(Students, StudentsAdmin)
使用裝飾器完成注冊(cè):
@admin.register(Students)
class StudentsAdmin(admin.ModelAdmin):
def gender(self):
...snip...
actions_on_top = False
actions_on_bottom = True
視圖的基本使用
概述:
在Django中,視圖是對(duì)web請(qǐng)求進(jìn)行回應(yīng)
視圖就是一個(gè)python函數(shù),在views.py文件中定義。
定義視圖:
示例:在myApp\views.py中寫入
from django.shortcuts import render
# Create your views here.
from django.http import HttpResponse
def index(request):
return HttpResponse("Sunck is a good man")
配置url:方法一:path方法:
修改project目錄下的urls.py文件:
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('myApp.urls')),
]
在myApp應(yīng)用目錄下創(chuàng)建urls.py文件:
from django.urls import path, include
from . import views
urlpatterns = [
path('',views.index),
]
配置url:方法二:url方法:
修改project目錄下的urls.py文件:
from django.contrib import admin
from django.conf.urls import url,include
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^', include('myApp.urls')),
]
在myApp應(yīng)用目錄下創(chuàng)建urls.py文件:
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^$', views.index),
]
模板的基本使用:
概述:模板是HTML頁(yè)面,可以根據(jù)視圖中傳遞過(guò)來(lái)的數(shù)據(jù)進(jìn)行填充
創(chuàng)建模板:
創(chuàng)建templates目錄,在目錄下創(chuàng)建對(duì)應(yīng)項(xiàng)目的模板目錄(project/templates/myApp)
配置模板路徑:
修改settings.py文件下的TEMPLATES下的'DIRS'為'DIRS': [os.path.join(BASE_DIR, 'templates')],
定義grades.html與students.html模板:
在templates\myApp\目錄下創(chuàng)建grades.html與students.html模板文件
模板語(yǔ)法:
{{輸出值,可以是變量,也可以是對(duì)象,屬性}}
{%執(zhí)行代碼段%}
http://127.0.0.1:8000/grades
寫grades.html模板:
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>班級(jí)信息</title>
</head>
<body>
<h1>班級(jí)信息列表</h1>
<ul>
<!--[python04, python05, python06]-->
{%for grade in grades%}
<li>
<a href="#">{{grade.gname}}</a>
</li>
{%endfor%}
</ul>
</body>
</html>
定義視圖:myApp\views.py
from .models import Grades
def grades(request):
# 去模板里取數(shù)據(jù)
gradesList = Grades.objects.all()
# 將數(shù)據(jù)傳遞給模板,模板再渲染頁(yè)面,將渲染好的頁(yè)面返回給瀏覽器
return render(request, 'myApp/grades.html', {"grades": gradesList})
配置url:myApp\urls.py
urlpatterns = [
url(r'^$', views.index),
url(r'^(\d+)/(\d+)$', views.detail),
url(r'^grades/', views.grades)
]
http://127.0.0.1:8000/students
寫students.html模板
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>學(xué)生頁(yè)面</title>
</head>
<body>
<h1>學(xué)生信息列表</h1>
<ul>
{%for student in students%}
<li>
{{student.sname}}--{{student.scontend}}
</li>
{%endfor%}
</ul>
</body>
</html>
定義視圖:myApp\views.py
from .models import Students
def students(request):
studentsList = Students.objects.all()
return render(request, 'myApp/students.html', {"students": studentsList})
配置url:myApp\urls.py
urlpatterns = [
url(r'^$', views.index),
url(r'^(\d+)/(\d+)$', views.detail),
url(r'^grades/', views.grades),
url(r'^students/', views.students),
]
需求:點(diǎn)擊班級(jí),顯示對(duì)應(yīng)班級(jí)的學(xué)生名字
運(yùn)行不正常https://www.bilibili.com/video/av17879644/?p=12
Django流程梳理
創(chuàng)建工程:執(zhí)行 django-admin startproject 工程名
創(chuàng)建項(xiàng)目:執(zhí)行 python manage.py startapp 項(xiàng)目名稱
激活項(xiàng)目:修改 settings.py中的INSTALLED_APPS
配置數(shù)據(jù)庫(kù):
修改__init__.py文件
修改settings.py文件中的DATABASES
創(chuàng)建模型類:在項(xiàng)目目錄下的models.py文件中創(chuàng)建
生成遷移文件:執(zhí)行python manage.py makemigrations
執(zhí)行遷移:執(zhí)行python manage.py migrate
配置站點(diǎn):略
創(chuàng)建模板目錄/項(xiàng)目模板目錄
在settings.py中的TEMPLATES添加templates路徑
在工程目錄下(project)修改urls.py
在項(xiàng)目目錄下創(chuàng)建urls.py
使用他人Django代碼需要的簡(jiǎn)易修改:
1.在settings.py中修改數(shù)據(jù)庫(kù)名
2.在settings.py中修改數(shù)據(jù)庫(kù)密碼
3.刪除由內(nèi)向外文件(在對(duì)應(yīng)目錄里鼠標(biāo)右鍵刪除)
4.在數(shù)據(jù)庫(kù)中創(chuàng)建對(duì)應(yīng)第一步的數(shù)據(jù)庫(kù)(自己在SQL中創(chuàng)建)
5.執(zhí)行生成遷移文件
6.執(zhí)行遷移
7.啟動(dòng)服務(wù)
8.瀏覽器測(cè)試
Django模型
Django對(duì)各種數(shù)據(jù)庫(kù)提供了很好的支持,Django為這些數(shù)據(jù)庫(kù)提供了統(tǒng)一的調(diào)用API
我們可以根據(jù)不同的業(yè)務(wù)需求選擇不同的數(shù)據(jù)庫(kù)。
配置數(shù)據(jù)庫(kù)
修改工程目錄下的__init__.py文件
import pymysql
pymysql.install_ad_MySQLdb()
修改settings.py文件中的DATABASES
開(kāi)發(fā)流程
配置數(shù)據(jù)庫(kù)
定義模型類:一個(gè)模型都在數(shù)據(jù)庫(kù)中對(duì)應(yīng)一張數(shù)據(jù)庫(kù)表
生成遷移文件
執(zhí)行遷移生成數(shù)據(jù)表
使用模型類進(jìn)行增刪改查
ORM
概述:對(duì)象-關(guān)系-映射
任務(wù):
根據(jù)對(duì)象的類型生成表結(jié)構(gòu)
將對(duì)象,列表的操作轉(zhuǎn)換成SQL語(yǔ)句
將SQL語(yǔ)句查詢到的結(jié)果轉(zhuǎn)換為對(duì)象,列表
優(yōu)點(diǎn):
極大的減輕了開(kāi)發(fā)人員的工作量,不需要面對(duì)因數(shù)據(jù)庫(kù)的變更而修改代碼的問(wèn)題
定義模型
模型,屬性,表,字段之間的關(guān)系
一個(gè)模型類在數(shù)據(jù)庫(kù)中對(duì)應(yīng)一張表,在模型類中定義的屬性,對(duì)應(yīng)該模型對(duì)照表中的一個(gè)字段
定義屬性:見(jiàn)下文
創(chuàng)建模型類
元選項(xiàng)
在模型類中定義Meta類,用于設(shè)置元信息
示例:
class Meta:
db_table = "students"
ordering = ['id']
db_table
定義數(shù)據(jù)表名,推薦用小寫字母,數(shù)據(jù)表名默認(rèn)為項(xiàng)目名小寫_類名小寫
ordering
對(duì)象的默認(rèn)排序字段,獲取對(duì)象的列表時(shí)使用
示例:
ordering['id'] id按升序排列
ordering['-id'] id按降序排列
注意:排序會(huì)增加數(shù)據(jù)庫(kù)開(kāi)銷
模型成員
類屬性
隱藏類屬性objects:
是Manager類型的一個(gè)對(duì)象,作用是與數(shù)據(jù)庫(kù)進(jìn)行交互
當(dāng)定義模型類時(shí)沒(méi)有指定管理器,則Django為模型創(chuàng)建一個(gè)名為objects的管理器
自定義管理器示例:
定義stuObj管理器:
stuObj = models.Manager()
當(dāng)為模型指定模型管理器,Django就不再為模型類生成objects模型管理器了。
自定義管理器Manager類
模型管理器是Django的模型進(jìn)行與數(shù)據(jù)庫(kù)交互的窗口,一個(gè)模型可以有多個(gè)模型管理器
作用:
向管理器類中添加額外的方法
修改管理器返回的原始查詢集
通常會(huì)重寫get_queryset()方法
代碼示例:
class StudentsManager(models.Manager):
def get_queryset(self):
return super(StudentsManger, self).get_queryset().filter(isDelete=False)
class Students(model.Moder):
# 自定義模型管理器
# 當(dāng)自定義模型管理器,objects就不存在了
stuObj = models.Manger()
stuObj2 = StudentsManager()
創(chuàng)建對(duì)象
目的:向數(shù)據(jù)庫(kù)中添加數(shù)據(jù)
當(dāng)創(chuàng)建對(duì)象時(shí),django不會(huì)對(duì)數(shù)據(jù)庫(kù)進(jìn)行讀寫操作,當(dāng)調(diào)用save()方法時(shí)才與數(shù)據(jù)庫(kù)交互,將對(duì)象保存在數(shù)據(jù)庫(kù)表中。
注意:
__init__方法已經(jīng)在父類models.Model中使用,在自定義的模型中無(wú)法使用。
方法:
在模型類中增加一個(gè)類方法,示例如下:
class Students(model.Moder):
...snip...
@classmethod
def createStudent(cls, name, age, gender, contend,
grade,lastT, createT, isD=False):
stu = cls(sname=name, sage=age, sgender=gender,
scontend=contend, sgrade=grade, lastTime=lastT, createTime=createT,
isDelete=isD)
return stu
在自定義管理器中添加一個(gè)方法,示例如下:
class StudentsManager(models.Manager):
def get_queryset(self):
return super(StudentsManager, self).get_queryset().filter(isDelete=False)
def createStudent(self, name, age, gender, contend, grade, lastT, createT, isD=False):
stu = self.model()
# print(type(grade))
stu.sname = name
stu.sage = age
stu.sgender = gender
stu.scontend = contend
stu.sgrade = grade
stu.lastTime = lastT
stu.createTime = createT
return stu
模型查詢
概述
查詢集表示從數(shù)據(jù)庫(kù)獲取的對(duì)象的集合
查詢集可以有多個(gè)過(guò)濾器
過(guò)濾器就是一個(gè)函數(shù),基于所給的參數(shù)限制查詢集結(jié)果
從SQL角度來(lái)說(shuō),查詢集和select語(yǔ)句等價(jià),過(guò)濾器就像where條件
查詢集
在管理器上調(diào)用過(guò)濾器方法返回查詢集
查詢集經(jīng)過(guò)過(guò)濾器篩選后返回新的查詢集,所以可以寫成鏈?zhǔn)秸{(diào)用
惰性執(zhí)行
創(chuàng)建查詢集不會(huì)帶來(lái)任何數(shù)據(jù)庫(kù)的訪問(wèn),直到調(diào)用數(shù)據(jù)庫(kù)時(shí),才會(huì)訪問(wèn)數(shù)據(jù)
直接訪問(wèn)數(shù)據(jù)的情況:
迭代
序列化
與if合用
返回查詢集的方法稱為過(guò)濾器
all():返回查詢集中的所有數(shù)據(jù)
filter():保留符合條件的數(shù)據(jù)
filter(鍵=值)
filter(鍵=值,鍵=值)
filter(鍵=值).filter(鍵=值) 且的關(guān)系
exclude():過(guò)濾掉符合條件的
order_by():排序
values():一條數(shù)據(jù)就是一個(gè)字典,返回一個(gè)列表
get()
返回一個(gè)滿足條件的對(duì)象
注意:
如果沒(méi)有找到符合條件的對(duì)象,會(huì)引發(fā)模型類.DoesNotExist異常
如果找到多個(gè)對(duì)象,會(huì)引發(fā)模型類MultipleObjectsReturned異常
count():返回查詢集中對(duì)象的個(gè)數(shù)
first():返回查詢集中第一個(gè)對(duì)象
last():返回查詢集中最后一個(gè)對(duì)象
exits():判斷查詢集中是否有數(shù)據(jù),如果有數(shù)據(jù)返回 True,否則返回 False.
限制查詢集
查詢集返回列表,可以使用下標(biāo)的方法進(jìn)行限制,等同于sql中的limit語(yǔ)句
注意:下標(biāo)不能是負(fù)數(shù)
示例:studentsList = Students.stuObj2.all()[0:5]
查詢集的緩存
概述:
每個(gè)查詢集都包含一個(gè)緩存,來(lái)最小化對(duì)數(shù)據(jù)庫(kù)的訪問(wèn)
在新建的查詢集中,緩存首次為空,第一次對(duì)查詢集求值,會(huì)發(fā)生數(shù)據(jù)緩存,Django會(huì)將查詢出來(lái)的數(shù)據(jù)做一個(gè)緩存,并返回查詢結(jié)果。
以后的查詢直接使用查詢集的緩存
字段查詢
概述
實(shí)現(xiàn)了sql中的where語(yǔ)句,作為方法filter(),exclude(),get()的參數(shù)
語(yǔ)法:屬性名稱__比較運(yùn)算符=值
外鍵:屬性名稱_id
轉(zhuǎn)義:類似sql中的like語(yǔ)句
like有關(guān)情況看我哥他%是為了匹配點(diǎn)位,匹配數(shù)據(jù)中的%使用(where like "\%")
filter(sname__contains="%")
比較運(yùn)算符
exact:判斷,大小寫敏感
filter(isDelete=False)
contains:是否包含,大小寫敏感
studentsList = Students.stuObj2.filter(sname__contains="孫")
startswith,endswith:以value開(kāi)頭或結(jié)尾,大小寫敏感
以上四個(gè)在前面加上i,就表示不區(qū)分大小寫iexact,icontains,istartswith,iendswith
isnull,isnotnull
是否為空
filter(sname__isnull=False)
in:是否包含在范圍內(nèi)
gt大于,gte大于等于,lt小于,lte小于等于
year,month,day,week_day,hour,minute,second
studentsList = Students.stuObj2.filter(lastTime__year=2017)
跨關(guān)聯(lián)查詢
處理join查詢
語(yǔ)法:
模型類名__屬性名__比較運(yùn)算符
# 描述中帶有‘薛延美’這三個(gè)字的數(shù)據(jù)是屬于哪個(gè)班級(jí)的
grade = Grades.objects.filter(students__scontend__contains='薛延美')
print(grade)
查詢快捷pk代表的主鍵
聚合函數(shù)
使用aggregate函數(shù)返回聚合函數(shù)的值
Avg
Count
Max
maxAge = Student.stuObj2.aggregate(Max('sage'))
maxAge為最大的sage。
Min
Sum
F對(duì)象
可以使用模型的A屬性與B屬性進(jìn)行比較
from django.db.models import F,Q
def grades1(request):
g = Grades.objects.filter(ggirlnum__gt=F('gboynum'))
print(g)
# [<Grades: python02>,<Grades: python03>]
return HttpResponse("OOOOOOOo")
支持F對(duì)象的算術(shù)運(yùn)算
g = Grades.objects.filter(ggirlnum__gt=F('gboynum')+20)
Q對(duì)象
概述:過(guò)濾器的方法的關(guān)鍵字參數(shù),條件為And模式
需求:進(jìn)行or查詢
解決:使用Q對(duì)象
def students4(request):
studentsList = Students.stuObj2.filter(Q(pk__lte=3) | Q(sage__gt=50))
return render(request, 'myApp/students.html', {"students": studentsList})
只有一個(gè)Q對(duì)象的時(shí)候,就是用于正常匹配條件
studentsList = Students.stuObj2.filter(~Q(pk__lte=3))
~Q是取反
定義屬性
概述:
django根據(jù)屬性的類型確定以下信息
當(dāng)前選擇的數(shù)據(jù)庫(kù)支持字段的類型
渲染管理表單時(shí)使用的默認(rèn)html控件
在管理站點(diǎn)最低限度的驗(yàn)證
django會(huì)為表增加自動(dòng)增長(zhǎng)的主鍵列,每個(gè)模型只能有一個(gè)主鍵列,如
果使用選項(xiàng)設(shè)置某屬性為主鍵列后,則django不會(huì)再生成默認(rèn)的主鍵列
屬性命名限制
遵循標(biāo)識(shí)符規(guī)則,且變量不能與Python保留字相同
由于django的查詢方式,不允許使用連續(xù)的下劃線
庫(kù)
定義屬性時(shí),需要字段類型,字段類型被定義在django.db.models.fields目錄下,
為了方便使用,被導(dǎo)入到django.db.models中
使用方式
導(dǎo)入: from django.db import models
通過(guò) models.Field創(chuàng)建字段類型的對(duì)象,賦值給屬性
邏輯刪除
對(duì)于重要類型都做邏輯刪除,不做物理刪除,實(shí)現(xiàn)方法是定義idDelete屬性,
類型為BooleanField,默認(rèn)值為False
字段類型
autoField
一個(gè)根據(jù)實(shí)際ID自動(dòng)增長(zhǎng)的IntegerField,通常不指定,
如果不指定,一個(gè)主鍵字段將自動(dòng)添加到模型中
CharField(max_length=字符長(zhǎng)度)
字符串,默認(rèn)的表彰樣式是TextInput
TextField
大文本字段,一般超過(guò)4000時(shí)使用,默認(rèn)的表單控件是Textarea
IntegerField
整數(shù)
DecimalField(max_digits=None, decimal_places=None)
使用Python的Decimal實(shí)例表示的十進(jìn)制浮點(diǎn)數(shù)
參數(shù)說(shuō)明
DecimalField.max_digits
位數(shù)總數(shù)
DecimalField.decimal_places
小數(shù)點(diǎn)后的數(shù)字位置
FloatField
使用Python的float實(shí)例來(lái)表示的浮點(diǎn)數(shù)
BooleanField
True/False 字段,此字段的默認(rèn)表彰控制是CheckboxInput
NullBooleanField
支持 Null, True, False 三種值
DateField([auto_now=False, auto_now_add=False])
使用Python的datetime.date實(shí)例表示的日期
參數(shù)說(shuō)明:
DateField.auto_now
每次保存對(duì)象時(shí),自動(dòng)設(shè)置該字段為當(dāng)前時(shí)間,用于“最后一次修改”
的時(shí)間戳,它總是使用當(dāng)前日期,默認(rèn)為 False
DateField.auto_now_add
當(dāng)前對(duì)象第一次被創(chuàng)建時(shí)自動(dòng)設(shè)置當(dāng)前時(shí)間,用于創(chuàng)建的時(shí)間戳,
它總是使用當(dāng)前日期,默認(rèn)為 False
說(shuō)明
該字段默認(rèn)對(duì)應(yīng)的表單控件是一個(gè)TextInput.在管理員站點(diǎn)添加了一個(gè)
JavaScript寫的日歷控件,和一個(gè)“Today”的快捷按鈕,包含了一個(gè)額外
的invalid_date錯(cuò)誤消息鍵
注意
auto_now_add, auto_now, and default 這些設(shè)置是相互排斥的,他們之間
的任何組合將會(huì)發(fā)生錯(cuò)誤的結(jié)果
TimeField
使用Python的datetime.time實(shí)例表示的時(shí)間,參數(shù)同DateField
DateTimeField
使用Python的datetime
datetime實(shí)例表示的日期和時(shí)間,參數(shù)同DateField
FileField
一個(gè)上傳文件的字段
ImageField
繼承了FileField的所有屬性和方法,但對(duì)上傳的對(duì)象進(jìn)行校驗(yàn),
確保它是一個(gè)有效的image
字段選項(xiàng)
概述
通過(guò)字段選項(xiàng),可以實(shí)現(xiàn)對(duì)字段的約束
在字段對(duì)象中通過(guò)關(guān)鍵字參數(shù)指定
null
如果為True,Django將空值以NULL存儲(chǔ)在數(shù)據(jù)庫(kù)中,默認(rèn)值為 False
blanke
如果為True,則該字段允許為空白,默認(rèn)值為 False
注意
null是數(shù)據(jù)庫(kù)范疇的概念,blank是表彰驗(yàn)證范疇的概念
db_column
字段的名稱,如果未指定,則使用屬性的名稱
db_index
若值為 True,則在表中會(huì)為此字段創(chuàng)建索引
default
默認(rèn)值
primary_key
若為 True,則該字段會(huì)成為模型的主鍵字段
unique
如果為 True,這個(gè)字段在表中必須有唯一值
關(guān)系
分類
ForeignKey:一對(duì)多,將字段定義在多的端中
ManyToManyField:多對(duì)多,將字段定義在兩端中
OneToOneField:一對(duì)一,將字段定義在任意一端中
用一訪問(wèn)多
格式
對(duì)象.模型類小寫_set
示例
grade.students_set
用一訪問(wèn)一
格式
對(duì)象.模型類小寫
示例
grade.studnets
訪問(wèn)id
格式
對(duì)象.屬性_id
示例
student.sgrade_id
視圖
概述:
作用:視圖接收web請(qǐng)求,并響應(yīng)web請(qǐng)求
本質(zhì):視圖就是python中的一個(gè)函數(shù)
響應(yīng):
響應(yīng)過(guò)程:
用戶在瀏覽器中輸入網(wǎng)址www.sunck.wang/sunck/index.html
---網(wǎng)址--->
django獲取網(wǎng)址信息,去掉IP與端口號(hào),網(wǎng)址變成:sunck/index.html
---虛擬路徑與文件名--->
url管理器逐個(gè)匹配urlconf,記錄視圖函數(shù)
---視圖函數(shù)名--->
視圖管理,找到對(duì)應(yīng)的視圖去執(zhí)行,返回結(jié)果給瀏覽器
---響應(yīng)的數(shù)據(jù)--->
返回第一步:用戶在瀏覽器中輸入網(wǎng)址
網(wǎng)頁(yè)
重定向
錯(cuò)誤視圖
404視圖:找不到網(wǎng)頁(yè)(url匹配不成功時(shí)返回)時(shí)返回
在templates目錄下定義404.html
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<h1>頁(yè)面丟失</h1>
<h2>{{request_path}}</h2>
</body>
</html>
request_path:導(dǎo)致錯(cuò)誤的網(wǎng)址
配置settings.py
DEBUG
如果為 True,永遠(yuǎn)不會(huì)調(diào)用404頁(yè)面,需要調(diào)整為 False 才會(huì)顯示
ALLOWED_HOSTS = ['*']
500視圖:在視圖代碼中出現(xiàn)錯(cuò)誤(服務(wù)器代碼錯(cuò)誤)
400視圖:錯(cuò)誤出現(xiàn)在客戶的操作
JSON數(shù)據(jù)
url配置
配置流程:
制定根級(jí)url配置文件
settings.py文件中的ROOT_URLCONF
ROOT_URLCONF = 'project.urls'
默認(rèn)實(shí)現(xiàn)了
urlpatterns
一個(gè)url實(shí)例的列表
url對(duì)象
正則表達(dá)式
視圖名稱
名稱
url匹配正則的注意事項(xiàng)
如果想要從url中獲取一個(gè)值,需要對(duì)正則加小括號(hào)
匹配正則前方不需要加'/'
正則前需要加'r'表示字符串不轉(zhuǎn)義
引入其他url配置
在應(yīng)用中創(chuàng)建urls.py文件,定義本應(yīng)用的url配置,在工程urls.py中使用include方法
project\urls.py
from django.contrib import admin
from django.conf.urls import url,include
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^', include('myApp.urls', namespace="myAPP")),
]
myApp\urls.py
from django.urls import path, include
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^$', views.index, name="index"),
]
url的反向解析
概述:如果在視圖,模板中使用了硬編碼鏈接,在url配置發(fā)生改變時(shí),動(dòng)態(tài)生成鏈接的地址
解決:在使用鏈接時(shí),通過(guò)url配置的名稱,動(dòng)態(tài)生成url地址
作用:使用url模板
視圖函數(shù)
定義視圖:
本質(zhì):一個(gè)函數(shù)
視圖參數(shù):
一個(gè)HttpRequest的實(shí)例
通過(guò)正則表達(dá)式獲取的參數(shù)
位置:一般在views.py文件下定義
HttpRequest對(duì)象
概述:
服務(wù)器接收http請(qǐng)求后,會(huì)根據(jù)報(bào)文創(chuàng)建HttpRequest對(duì)象
視圖的第一個(gè)參數(shù)就是HttpRequest對(duì)象
django創(chuàng)建的,之后調(diào)用視圖時(shí)傳遞給視圖
屬性
path:請(qǐng)求的完整路徑(不包括域名和端口)
method:表示請(qǐng)求的方式,常用的有GET,POST
encoding:表示瀏覽器提交的數(shù)據(jù)的編碼方式,一般為utf-8
GET:類似于字典的對(duì)象,包含了get請(qǐng)求的所有參數(shù)
POST:類似于字典的對(duì)象,包含了post請(qǐng)求的所有參數(shù)
FILES:類似字典的對(duì)象,包含了所有上傳的文件
COOKIES:字典,包含所有的cookie
session:類似字典的對(duì)象,表示當(dāng)前會(huì)話
方法
is_ajax():如果是通過(guò)XMLHttpRequest發(fā)起的,返回 True
QueryDict對(duì)象
request對(duì)象中的GET,POST都屬于QueryDict對(duì)象
方法:
get():
根據(jù)鍵獲取值,只能獲取一個(gè)值
www.sunck.wang/abc?a=1&b=2&c=3
getlist()
將鍵的值以列表的形式返回
可以獲取多個(gè)值
www.sunck.wang/abc?a=1&b=2&c=3
GET屬性
獲取瀏覽器傳遞過(guò)來(lái)數(shù)據(jù)
www.sunck.wang/abc?a=1&b=2&c=3
urls.py
url(r'^get1', views.get1), #結(jié)尾不能加$,否則無(wú)法匹配
views.py
def get1(request):
a = request.GET.get('a')
b = request.GET.get('b')
c = request.GET.get('c')
return HttpResponse(a + " " + b + " " + c)
www.sunck.wang/abc?a=1&a=2&c=3
urls.py
url(r'^get2', views.get2),
views.py
def get2(request):
a = request.GET.getlist('a')
a1 = a[0]
a2 = a[1]
c = request.GET.get('c')
return HttpResponse(a1 + " " + a2 + " " + c)
POST屬性
使用表單模擬POST請(qǐng)求
關(guān)閉CSRF:project\project\settings.py
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
# 'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
示例:
def showregist(request):
return render(request, 'myApp/regist.html',)
def regist(request):
name = request.POST.get("name")
gender = request.POST.get("gender")
age = request.POST.get("age")
hobby = request.POST.getlist("hobby")
print(name)
print(gender)
print(age)
print(hobby)
return HttpResponse("regist")
路徑:
url(r'^showregist/$', views.showregist),
url(r'^showregist/regist/$', views.regist),
頁(yè)面:
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>注冊(cè)</title>
</head>
<body>
<form action="regist/" method="post">
姓名:<input type="text" name="name" value=""/>
<hr>
性別:<input type="radio" name="gender" value="1">男<input type="radio" name="gender" value="0">女
<hr>
愛(ài)好:<input type="checkbox" name="hobby" value="power"/>權(quán)利<input type="checkbox" name="hobby" value="money">金錢<input type="checkbox" name="hobby" value="beauty">美女<input type="checkbox" name="hobby" value="Tesla">Tesla
<hr>
<input type="submit" value="注冊(cè)">
</form>
</body>
</html>
HttpResponse對(duì)象
概述:
作用:給瀏覽器返回?cái)?shù)據(jù)
HttpRequest對(duì)象是由Django創(chuàng)建的,HttpResponse對(duì)象是由程序員創(chuàng)建
用法:
不用模板,直接返回?cái)?shù)據(jù)
語(yǔ)句示例:return HttpResponse("Sunck is a good man")
調(diào)用模板
使用render方法
原型:render(request, templateName[, context])
作用:結(jié)合數(shù)據(jù)和模板,返回一個(gè)完整的HTML頁(yè)面
參數(shù):
request:請(qǐng)求體對(duì)象
templateName:模板路徑
context:傳遞給需要渲染在模板上的數(shù)據(jù)
屬性
content:表示返回內(nèi)容
charset:編碼格式
status_code:響應(yīng)狀態(tài)碼
200
304
404
400
content-type:指定輸出的MIME類型
方法
init:使用頁(yè)面內(nèi)容實(shí)例化HttpResponse對(duì)象
write(content):以文件的形式寫入
flush():以文件的形式輸出緩沖區(qū)
set_cookie(key, value, maxAge=None, exprise=None)
delete_cookie(key):
刪除cookie
如果刪除一個(gè)不存在的cookie,就當(dāng)什么都沒(méi)發(fā)生
子類HttpResponseRedirect
功能:重定向,服務(wù)器端的跳轉(zhuǎn)
簡(jiǎn)寫
redirect(to)
to推薦使用反向解析
示例:
from django.http import HttpResponseRedirect
from django.shortcuts import redirect
def redirect1(request):
# return HttpResponseRedirect('/redirect2')
return redirect('/redirect2')
def redirect2(request):
return HttpResponse("我是重定向后的視圖")
子類JsonResponse
返回Json數(shù)據(jù),一般用于異步請(qǐng)求
__init__(self.data)
data 字典
注意:Content-type類型為application/json
狀態(tài)保持
http協(xié)議是無(wú)狀態(tài)的,每次請(qǐng)求都是一次新的請(qǐng)求,它不記得之前的請(qǐng)求。
客戶端與服務(wù)器的一次通信就是一次會(huì)話
實(shí)現(xiàn)狀態(tài)的保持,在客戶端或服務(wù)端存儲(chǔ)有關(guān)會(huì)話的數(shù)據(jù)
存儲(chǔ)的方式
cookie:所有數(shù)據(jù)存儲(chǔ)在客戶端,不要存儲(chǔ)敏感的數(shù)據(jù)
session:所有的數(shù)據(jù)存儲(chǔ)在服務(wù)端,在客戶端用cookie存儲(chǔ)session_id
狀態(tài)保持的目的:
在一段時(shí)間內(nèi)跟蹤請(qǐng)求者的狀態(tài),可以實(shí)現(xiàn)跨頁(yè)面訪問(wèn)當(dāng)前的請(qǐng)求者的數(shù)據(jù)
注意:不同的請(qǐng)求者之間不會(huì)共享這個(gè)數(shù)據(jù),與請(qǐng)求者一一對(duì)應(yīng)
啟用session:project\project\settings.py
INSTALLED_APPS 'django.contrib.sessions',
MIDDLEWARE 'django.contrib.sessions.middleware.SessionMiddleware',
使用session
啟用session后,每個(gè)httpRequest對(duì)象都有一個(gè)session屬性
get[key, default=None] 根據(jù)鍵獲取session值
clear() 清空所有會(huì)話
flush() 刪除當(dāng)前會(huì)話并刪除會(huì)話的cookie
示例:
# session
def main(request):
# 取session
username = request.session.get('name', '游客')
print(username)
return render(request, 'myApp/main.html', {'username': username})
def login(request):
return render(request, 'myApp/login.html')
def showmain(request):
print("*****************")
username = request.POST.get('username')
# 存儲(chǔ)session
request.session['name'] = username
return redirect('/main/')
from django.contrib.auth import logout
def quit(request):
# 清除session
logout(request) # 方法1,推薦
# request.session.clear() # 方法2
request.session.flush() # 方法3
return redirect('/main/')
設(shè)置session過(guò)期時(shí)間
set_expiry(value)
request.session.set_expiry(10) 設(shè)置為10秒后過(guò)期
如果不設(shè)置,2個(gè)星期后過(guò)期
value設(shè)置為0代表關(guān)閉瀏覽器時(shí)過(guò)期
value設(shè)置為None代表設(shè)置永不過(guò)期,不推薦
Redis使用:略

|