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í)說明: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ù)庫 Django默認(rèn)使用SQLite數(shù)據(jù)庫 在settings.py文件中通過DATABASES選項(xiàng)進(jìn)行數(shù)據(jù)庫配置配置MySQL Python3.x中安裝的是PyMySQL 在__init__.py文件中寫入兩行代碼import pymysql pymysql.install_as_MySQLdb() 以數(shù)據(jù)庫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ù)處理 打開CMD,進(jìn)入project(目錄名)的目錄下,輸入命令創(chuàng)建名為myApp的app: python manage.py startapp myAPPmyAPP目錄說明 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,) 說明: 不需要定義主鍵,在生成時(shí)自動(dòng)添加,并且值為自動(dòng)增加在數(shù)據(jù)庫中生成數(shù)據(jù)表 生成遷移文件 執(zhí)行 python manage.py makemigrations 在migrations目錄下生成一個(gè)遷移文件,此時(shí)數(shù)據(jù)庫中還沒有生成數(shù)據(jù)表 執(zhí)行遷移 執(zhí)行 python manage.py migrate 相當(dāng)于執(zhí)行MySQL語句創(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ù)庫中的相應(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ù)庫當(dāng)中。啟動(dòng)服務(wù)器: 格式:python manage.py runserver ip:port 注意:ip可以不寫,不寫代表本機(jī)ip 端口號(hào)默認(rèn)是8000 python manage.py runserver 說明: 這是一個(gè)純python編寫的輕量級(jí)web服務(wù)器,僅僅在開發(fā)測(cè)試中使用這個(gè)Admin站點(diǎn)管理: 概述: 內(nèi)容發(fā)布:負(fù)責(zé)添加,修改,刪除內(nèi)容的 公告訪問 配置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) 自定義管理頁面: 屬性說明 # 列表頁屬性 list_display = [] # 顯示字段設(shè)置 list_filter = [] # 過濾字段設(shè)置 search_fields = [] # 搜索字段設(shè)置 list_per_page = [] # 分頁設(shè)置 # 添加,修改頁屬性 fields = [] # 規(guī)定屬性的先后順序 fieldsets = [] # 給屬性分組 注意:fields與fieldsets不能同時(shí)使用 屬性示例: # 列表頁屬性 list_display = ['pk', 'gname', 'gdate', 'ggirlnum', 'gboynum', 'isDelete'] list_filter = ['gname'] search_fields = ['gname'] list_per_page = 5 # 添加,修改頁屬性 # 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] 布爾值顯示問題示例: class StudentsAdmin(admin.ModelAdmin): def gender(self): if self.sgender: return "男" else: return "女" # 設(shè)置頁面列的名稱 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頁面,可以根據(jù)視圖中傳遞過來的數(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模板文件 模板語法: {{輸出值,可以是變量,也可以是對(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ù)傳遞給模板,模板再渲染頁面,將渲染好的頁面返回給瀏覽器 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é)生頁面</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=12Django流程梳理 創(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ù)庫: 修改__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代碼需要的簡易修改:1.在settings.py中修改數(shù)據(jù)庫名2.在settings.py中修改數(shù)據(jù)庫密碼3.刪除由內(nèi)向外文件(在對(duì)應(yīng)目錄里鼠標(biāo)右鍵刪除)4.在數(shù)據(jù)庫中創(chuàng)建對(duì)應(yīng)第一步的數(shù)據(jù)庫(自己在SQL中創(chuàng)建)5.執(zhí)行生成遷移文件6.執(zhí)行遷移7.啟動(dòng)服務(wù)8.瀏覽器測(cè)試Django模型 Django對(duì)各種數(shù)據(jù)庫提供了很好的支持,Django為這些數(shù)據(jù)庫提供了統(tǒng)一的調(diào)用API 我們可以根據(jù)不同的業(yè)務(wù)需求選擇不同的數(shù)據(jù)庫。 配置數(shù)據(jù)庫 修改工程目錄下的__init__.py文件 import pymysql pymysql.install_ad_MySQLdb() 修改settings.py文件中的DATABASES 開發(fā)流程 配置數(shù)據(jù)庫 定義模型類:一個(gè)模型都在數(shù)據(jù)庫中對(duì)應(yīng)一張數(shù)據(jù)庫表 生成遷移文件 執(zhí)行遷移生成數(shù)據(jù)表 使用模型類進(jìn)行增刪改查 ORM 概述:對(duì)象-關(guān)系-映射 任務(wù): 根據(jù)對(duì)象的類型生成表結(jié)構(gòu) 將對(duì)象,列表的操作轉(zhuǎn)換成SQL語句 將SQL語句查詢到的結(jié)果轉(zhuǎn)換為對(duì)象,列表 優(yōu)點(diǎn): 極大的減輕了開發(fā)人員的工作量,不需要面對(duì)因數(shù)據(jù)庫的變更而修改代碼的問題 定義模型 模型,屬性,表,字段之間的關(guān)系 一個(gè)模型類在數(shù)據(jù)庫中對(duì)應(yīng)一張表,在模型類中定義的屬性,對(duì)應(yīng)該模型對(duì)照表中的一個(gè)字段 定義屬性:見下文 創(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ù)庫開銷 模型成員 類屬性 隱藏類屬性objects: 是Manager類型的一個(gè)對(duì)象,作用是與數(shù)據(jù)庫進(jìn)行交互 當(dāng)定義模型類時(shí)沒有指定管理器,則Django為模型創(chuàng)建一個(gè)名為objects的管理器 自定義管理器示例: 定義stuObj管理器: stuObj = models.Manager() 當(dāng)為模型指定模型管理器,Django就不再為模型類生成objects模型管理器了。 自定義管理器Manager類 模型管理器是Django的模型進(jìn)行與數(shù)據(jù)庫交互的窗口,一個(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ù)庫中添加數(shù)據(jù) 當(dāng)創(chuàng)建對(duì)象時(shí),django不會(huì)對(duì)數(shù)據(jù)庫進(jìn)行讀寫操作,當(dāng)調(diào)用save()方法時(shí)才與數(shù)據(jù)庫交互,將對(duì)象保存在數(shù)據(jù)庫表中。 注意: __init__方法已經(jīng)在父類models.Model中使用,在自定義的模型中無法使用。 方法: 在模型類中增加一個(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ù)庫獲取的對(duì)象的集合 查詢集可以有多個(gè)過濾器 過濾器就是一個(gè)函數(shù),基于所給的參數(shù)限制查詢集結(jié)果 從SQL角度來說,查詢集和select語句等價(jià),過濾器就像where條件 查詢集 在管理器上調(diào)用過濾器方法返回查詢集 查詢集經(jīng)過過濾器篩選后返回新的查詢集,所以可以寫成鏈?zhǔn)秸{(diào)用 惰性執(zhí)行 創(chuàng)建查詢集不會(huì)帶來任何數(shù)據(jù)庫的訪問,直到調(diào)用數(shù)據(jù)庫時(shí),才會(huì)訪問數(shù)據(jù) 直接訪問數(shù)據(jù)的情況: 迭代 序列化 與if合用 返回查詢集的方法稱為過濾器 all():返回查詢集中的所有數(shù)據(jù) filter():保留符合條件的數(shù)據(jù) filter(鍵=值) filter(鍵=值,鍵=值) filter(鍵=值).filter(鍵=值) 且的關(guān)系 exclude():過濾掉符合條件的 order_by():排序 values():一條數(shù)據(jù)就是一個(gè)字典,返回一個(gè)列表 get() 返回一個(gè)滿足條件的對(duì)象 注意: 如果沒有找到符合條件的對(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語句 注意:下標(biāo)不能是負(fù)數(shù) 示例:studentsList = Students.stuObj2.all()[0:5] 查詢集的緩存 概述: 每個(gè)查詢集都包含一個(gè)緩存,來最小化對(duì)數(shù)據(jù)庫的訪問 在新建的查詢集中,緩存首次為空,第一次對(duì)查詢集求值,會(huì)發(fā)生數(shù)據(jù)緩存,Django會(huì)將查詢出來的數(shù)據(jù)做一個(gè)緩存,并返回查詢結(jié)果。 以后的查詢直接使用查詢集的緩存 字段查詢 概述 實(shí)現(xiàn)了sql中的where語句,作為方法filter(),exclude(),get()的參數(shù) 語法:屬性名稱__比較運(yùn)算符=值 外鍵:屬性名稱_id 轉(zhuǎn)義:類似sql中的like語句 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開頭或結(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ù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ā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ù)庫支持字段的類型 渲染管理表單時(shí)使用的默認(rèn)html控件 在管理站點(diǎn)最低限度的驗(yàn)證 django會(huì)為表增加自動(dòng)增長的主鍵列,每個(gè)模型只能有一個(gè)主鍵列,如 果使用選項(xiàng)設(shè)置某屬性為主鍵列后,則django不會(huì)再生成默認(rèn)的主鍵列 屬性命名限制 遵循標(biāo)識(shí)符規(guī)則,且變量不能與Python保留字相同 由于django的查詢方式,不允許使用連續(xù)的下劃線 庫 定義屬性時(shí),需要字段類型,字段類型被定義在django.db.models.fields目錄下, 為了方便使用,被導(dǎo)入到django.db.models中 使用方式 導(dǎo)入: from django.db import models 通過 models.Field創(chuàng)建字段類型的對(duì)象,賦值給屬性 邏輯刪除 對(duì)于重要類型都做邏輯刪除,不做物理刪除,實(shí)現(xiàn)方法是定義idDelete屬性, 類型為BooleanField,默認(rèn)值為False 字段類型 autoField 一個(gè)根據(jù)實(shí)際ID自動(dòng)增長的IntegerField,通常不指定, 如果不指定,一個(gè)主鍵字段將自動(dòng)添加到模型中 CharField(max_length=字符長度) 字符串,默認(rèn)的表彰樣式是TextInput TextField 大文本字段,一般超過4000時(shí)使用,默認(rèn)的表單控件是Textarea IntegerField 整數(shù) DecimalField(max_digits=None, decimal_places=None) 使用Python的Decimal實(shí)例表示的十進(jìn)制浮點(diǎn)數(shù) 參數(shù)說明 DecimalField.max_digits 位數(shù)總數(shù) DecimalField.decimal_places 小數(shù)點(diǎn)后的數(shù)字位置 FloatField 使用Python的float實(shí)例來表示的浮點(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ù)說明: 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 說明 該字段默認(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) 概述 通過字段選項(xiàng),可以實(shí)現(xiàn)對(duì)字段的約束 在字段對(duì)象中通過關(guān)鍵字參數(shù)指定 null 如果為True,Django將空值以NULL存儲(chǔ)在數(shù)據(jù)庫中,默認(rèn)值為 False blanke 如果為True,則該字段允許為空白,默認(rèn)值為 False 注意 null是數(shù)據(jù)庫范疇的概念,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ì)一,將字段定義在任意一端中 用一訪問多 格式 對(duì)象.模型類小寫_set 示例 grade.students_set 用一訪問一 格式 對(duì)象.模型類小寫 示例 grade.studnets 訪問id 格式 對(duì)象.屬性_id 示例 student.sgrade_id視圖 概述: 作用:視圖接收web請(qǐng)求,并響應(yīng)web請(qǐng)求 本質(zhì):視圖就是python中的一個(gè)函數(shù) 響應(yīng): 響應(yīng)過程: 用戶在瀏覽器中輸入網(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)頁 重定向 錯(cuò)誤視圖 404視圖:找不到網(wǎng)頁(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>頁面丟失</h1> <h2>{{request_path}}</h2> </body> </html> request_path:導(dǎo)致錯(cuò)誤的網(wǎng)址 配置settings.py DEBUG 如果為 True,永遠(yuǎn)不會(huì)調(diào)用404頁面,需要調(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í),通過url配置的名稱,動(dòng)態(tài)生成url地址 作用:使用url模板 視圖函數(shù) 定義視圖: 本質(zhì):一個(gè)函數(shù) 視圖參數(shù): 一個(gè)HttpRequest的實(shí)例 通過正則表達(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():如果是通過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屬性 獲取瀏覽器傳遞過來數(shù)據(jù) www.sunck.wang/abc?a=1&b=2&c=3 urls.py url(r'^get1', views.get1), #結(jié)尾不能加$,否則無法匹配 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), 頁面: <!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> 愛好:<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ù) 語句示例:return HttpResponse("Sunck is a good man") 調(diào)用模板 使用render方法 原型:render(request, templateName[, context]) 作用:結(jié)合數(shù)據(jù)和模板,返回一個(gè)完整的HTML頁面 參數(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:使用頁面內(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)什么都沒發(fā)生 子類HttpResponseRedirect 功能:重定向,服務(wù)器端的跳轉(zhuǎ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é)議是無狀態(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)跨頁面訪問當(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過期時(shí)間 set_expiry(value) request.session.set_expiry(10) 設(shè)置為10秒后過期 如果不設(shè)置,2個(gè)星期后過期 value設(shè)置為0代表關(guān)閉瀏覽器時(shí)過期 value設(shè)置為None代表設(shè)置永不過期,不推薦Redis使用:略
聯(lián)系客服