1.Django中的相應物件
建構式格式:
HttpResponse(content=回應體,content_type=回應體資料型別,status=狀態碼)
作用:
向客戶端瀏覽器回傳相應,同時攜帶回應體內容,
引數:
--content:表示回傳的內容,
--status_code:回傳的HTTP回應狀態碼(默認為200),
--content_type:指定回傳資料的MIME型別(默認為“text/html”),瀏覽器會根據這個屬性,來顯示資料,如果是text/html,那么就會決議這個字串,如果是text/plain,那么就會顯示一個純文本,
回應頭中常見的Content-Type:
-- text/html :默認的,html檔案
--text/plain:純文本
--text/css:css檔案
--text/javascript:js檔案
--multipart/form-data:檔案提交
--application/json:json傳輸
--application/xml:xml檔案
2.GET處理
request.GET['引數名'] ##QueryDict
request.GET.get('引數名','默認值')
request.GET.getlist('引數名')
3.模板
(1)模板是可以根據字典資料動態變化的html網頁,
(2)模板可以根據視圖中傳遞的字典資料動態生成相應的HTML網頁,
(3)創建模板檔案夾,一般位于<專案名>/templates
(4)在settings.py中,TEMPLATES的配置項:
"BACKEND":指定模板的引擎,
"DIRS":模板的搜索目錄(可以是一個或者多個)
"APP_DIRS":是否要在應用中的templates檔案夾中搜索模板檔案,
OPTIONS":有關模板的選項,
4.模板的加載
方案1
通過loader獲取模板,通過HttpResponse進行回應,注意是在視圖函式中實作,
例如
from django.template import loader #1 通過loader加載模板 t = loader.get_template("模板檔案名") #2 將t轉換成HTML字串 html = t.render(字典資料) #3 用回應物件將轉化的字串內容回傳給瀏覽器 return HttpResponse(html)
方案2,也是常用的方法
使用render(()直接加載并相應模板,注意是在視圖函式中實作,
from django.shortcuts import render, get_object_or_404 return render(request, "模板檔案名", 字典資料)
5.視圖層與模板層之間的互動
(1).視圖函式中,可以將Python變數封裝到字典中,然后傳遞大模板,
例如
context = { "active_user": active_user, "group_list": group_list, "enable_backup_switch": config.get("enable_backup_switch"), } return render(request, "XXXX.html", context)
(2).模板中,我們可以用{{ 變數名 }}的語法,呼叫視圖傳進來的變數,
6.模板的變數
(1)能傳遞到模板中的資料型別
str --字串 int ---整型
list --陣列 tuple --元組
dict--字典 func--方法
obj --類實體化的物件
(2)在模板中使用變數語法
--{{ 變數名 }}
--{{ 變數名.index }} ---例如傳遞過來的變數是list
--{{ 變數名.key }} ---例如傳遞過來的變數是字典
--{{ 物件.方法 }}
--{{ 函式名 }}
7.模板過濾器
定義:在變數輸出時對變數的值進行處理
作用:可以通過使用 過濾器 來改變變數的輸出顯示
語法:
{{ 變數名 | 過濾器1:可選引數1 | 過濾器2:可選引數2 ... }}
8.模板的繼承
模板繼承可以使父模板的內容重用,子模版直接繼承父模板的全部內容并可以覆寫父模板中相應的塊,
語法--父模板中:
(1)定義父模板中的塊block標簽;
(2)標識出哪些在子模塊中是允許被修改的;
(3)block標簽:在父模板中定義,可以在子模版中覆寫,
語法--子模版中:
(1)繼承模板extends 標簽(寫在模板檔案的第一行)
例如 {% extends "base.html" %}
(2)子模版 重寫父模板中的內容塊
{% block block_name %}
子模版塊用來覆寫父模板塊中 block_name 塊的內容
{% endblock block_name %}
9.代碼中URL出現的位置
(1)模板【html】中的url
A.<a href='https://www.cnblogs.com/xuliuzai/archive/2022/09/12/url'>超鏈接</a>
點擊后,頁面跳轉至url
B.<from action = 'url' method = 'post'>
from 表單中的資料,用post方法提交至url
(2)視圖函式中--302跳轉,HttpResponseRedirect('url')
將用戶地址欄中的地址跳轉到url,
10.url反向決議
url反向決議是指在視圖或模板中,用path定義的名稱來動態查找或者計算出相應的路由,
path函式的語法
path(route,views,name="別名")
例如:
path('page',views.page_vies,name="page_url")
根據path中的'name='關鍵字傳參給url確定了個唯一確定的名字,在模板
或視圖中,可以通過這個名字反向推斷出此url資訊,
模板中使用,通過url標簽實作地址的方向決議:
{% url '別名'%}
{% url '別名' '引數值1' '引數值2' %}
在視圖函式中使用,可呼叫django中的reverse方法進行反向決議,
from django.urls import reverse
reverse('別名',args=[],kwargs={})
11.靜態檔案配置
* 靜態檔案配置位于settings.py中,
配置靜態檔案的訪問路徑【配置默認存在】
# Static files (CSS, JavaScript, Images) STATIC_URL = "/static/" STATIC_ROOT = os.path.join(BASE_DIR, "static") STATICFILES_DIRS = [ os.path.join(BASE_DIR, "common/static"), ] STATICFILES_STORAGE = "common.storage.ForgivingManifestStaticFilesStorage"
說明:(1)指定訪問靜態檔案時是需要通過/static/xxx或http://127.0.0.1:80/static/xxx.
[xxx表示具體的靜態資源位置];
(2)STATICFILES_DIRS ---保存的是靜態檔案在服務器端的存盤位置,
12.Django中的應用
應用在Django專案中是一個獨立的業務模塊,可以包含自己的路由、視圖、模板、模型,
(1)創建應用
step 1 用manage.py 中的子命令startapp 創建應用檔案夾
python manage.py startapp XXXX
step 2 在settings.py 的INSTALLED_APPS = ()串列中配置安裝此應用,
13.分布式路由
Django中,主路由組態檔(urls.py)可以不處理用戶具體路由,主路由組態檔可以做請求的分發(分布式請求處理),具體的請求可以由各自的應用來進行處理,

配置分布式路由
step 1 --主路由中呼叫include函式
匯入的模塊
from django.urls import include, path
語法:include('app名字.url 模塊名')
作用:用于將當前路由轉到各個應用的路由組態檔的urlpatterns進行分布式處理,
例如 archery專案中的分布式配置,
urlpatterns = [ path("admin/", admin.site.urls), path("api/", include(("sql_api.urls", "sql_api"), namespace="sql_api")), path("", include(("sql.urls", "sql"), namespace="sql")), ]
14 應用下的模板
應用內部可以配置模板目錄
(1)應用下手動創建templates檔案夾;
(2)settings.py中 開啟 應用模板功能,TEMPLATES 配置項中的"APP_DIRS": True 即可,
應用下templates 和外層templates都存在是,django的查找模板規則:
(1)優先查找外層templates目錄下的模板;
(2)按# Application definition 中 INSTALLED_APPS 配置下的 應用順序,逐層查找,
15 什么是模型
模型是一個Python類,它是由django.db.models.Model派生出的子類,
一個模型類代表資料庫中的一張資料表,
模型類中每一個類屬性都代表資料庫中的一個欄位,
模型是資料互動的介面,是表示和操作資料庫的方法和方式,
16.ORM框架
定義: ORM(Object Relational Mapping)即物件關系映射,它是一種程式技術,它允許你使用類和物件對資料庫進行操作,從而避免通過SQL陳述句操作資料庫,
作用:
(1)建立模型類和表之間的對應關系,允許我們通過面向物件的方式來操作資料庫,
(2)根據設計的模型類生成資料庫中的表,
(3)通過簡單的配置就可以進行資料庫的部署或DB型別的切換,
有點:
(1)只需要面向物件編程,不需要面向資料庫撰寫代碼,
對資料庫的操作都轉化成對類屬性和方法的操作;不用撰寫各種資料庫的SQL陳述句,
(2)實作了資料庫模型與資料庫的解耦,屏蔽了不同資料庫操作上的差異,
不再關注于用的是MySQL、Oracle,,,等資料庫的內部細節;通過簡單的配置就可以輕松更換資料庫,而不需要修改代碼,
缺點:
對于復雜業務,使用成本較高;
根據物件的操作轉換成SQL陳述句,根據查詢的結果轉換成物件,在映射程序中有性能損失,
17.模型--資料庫遷移
遷移是Django同步您對資料庫所做的更改(添加欄位、洗掉模型等)到您的資料庫模型的方式,
(1)生成遷移檔案,執行 python manage.py makemigrations ,將應用下的models.py檔案生成一個中間檔案,并保存在migrations檔案夾中,
(2)執行遷移腳本程式,--執行 python manage.py migrate ,執行遷移程式實作遷移,將每個應用下的makemigrations目錄中的中間檔案同步回資料庫,
18. 模型---欄位型別
常見欄位型別相關說明補充如下:
| 欄位型別 | 編程語言 | 資料庫語言 | 備注 |
| BooleanField() | 使用True或False來表示值, |
tinyint(1) |
在資料庫中,使用1或0來表示具體的值, |
NullBooleanField() |
可以為空的布林值, | ||
| CharField(Field) | varchar() | 必須提供max_length引數, max_length表示字符長度 | |
| DateField() | 表示日期 | date |
引數: auto_now:每次保存物件時,自動設定該欄位為當前時間(取值:True/False); auto_now_add:當物件第一次被創建時自動設定當前時間(取值:True/False); default:設定當前時間(取值:字串格式時間,如:'2019-10-15'); 以上三個引數只能多選一, |
| DateTimeField() | 表示日期和時間 | datetime(6) |
引數同DateField. |
| DecimalField() | 使用小數表示該列的值 |
使用小數 decimal(x,y) |
引數: max_digits,小數總長度【位數總數】,包括小數點后的位數,該值必須大于等于decimal_places; decimal_places,小數位長度【小數點后的數字數量】, |
| FloatField() | 浮點型 | double | 編程語言中和資料庫中都使用小數表示值, |
| EmailField() | 字串型別 | varchar |
Django Admin以及ModelForm中提供驗證機制, 編程語言和資料庫中使用字串, |
| IPAddressField() | 字串型別 | Django Admin以及ModelForm中提供驗證 IPV4 機制 | |
GenericIPAddressField() |
字串型別 |
Django Admin以及ModelForm中提供驗證 Ipv4和Ipv6, 引數:
|
|
| IntegerField() | 整數列 | int |
編程語言和資料庫中使用整數, |
| SmallIntegerField() | 小整數 -32768 ~ 32767 |
||
| BigIntegerField() | 長整型(有符號的) -9223372036854775808 ~ 9223372036854775807 |
||
| ImageField() | 字串 | varchar(100) |
在資料庫中為了保存圖片的路徑【路徑保存在資料庫中,檔案上傳到指定目錄】, 編程語言和資料庫中使用字串, 引數:
|
| TextField() | 文本型別 | longtext |
表示不定長的字符資料, |
19. 模型 --欄位選項
欄位選項時指創建列時指定的額外的資訊,允許出現多個欄位選項,多個選項之間用【,】隔開,
| 欄位選項 | 作用描述 |
| primary_key |
如果設定為True,表示該列為主鍵,如果指定一個欄位為主鍵,則此表不會再自動創建id欄位, |
| blank |
Admin中是否允許用戶輸入為空 表單提交時可以為空, 設定為True時,欄位可以為空;設定為False時,欄位則必須填寫, |
| null |
如果設定為True,表示該列值允許為空,默認為False,如果此選項為False,建議加入default選項來設定默認值, |
| default |
資料庫中欄位的默認值, 設定所在列默認值,如果欄位選項null=False,建議添加此項, |
| db_index | 資料庫中欄位是否可以建立索引(db_index=True),如果為True,表示為該列增加索引, |
| unique |
|
| db_column | 欄位的列名,指定列的名稱,如果不指定的話則采用屬性名稱作為列名, |
| verbose_name | Admin中顯示的欄位名稱,設定此欄位在admin界面上的顯示名稱, |
| choices | Admin中顯示選擇框的內容,用不變動的資料放在記憶體中從而避免跨表操作, |
| error_messages | 自定義錯誤資訊(字典型別),從而定制想要顯示的錯誤資訊, |
| validators | 自定義錯誤驗證(串列型別),從而定制想要的驗證規則, |
20 模型--Meta類
使用內部Meta類來給模型賦予屬性,Meta類下有很多內建的類屬性,可以對模型類做一些控制,
部分屬性說明如下:
| 屬性 | 屬性說明 |
| managed | 因為Django會自己主動依據模型類生成映射的資料庫表,假設你不希望Django這么做,能夠把managed的值設定為False, |
|
db_table |
db_table是用于指定自己定義資料庫表名的,Django有一套默認的依照一定規則生成資料模型相應的資料庫表名,假設你想使用自己定義的表名,就通過這個屬性指定, |
| verbose_name | 給模型類起一個更可讀的名字, |
| verbose_name_plural | 這個選項是指定,模型的復數形式是什么, |
|
db_tablespace |
有些資料庫有資料庫表空間,比方Oracle,通過db_tablespace來指定這個模型相應的資料庫表放在哪個資料庫表空間, |
| unique_together | unique_together這個選項用于:當你須要通過兩個欄位保持唯一性時使用, |
|
abstract |
這個屬性是定義當前的模型類是不是一個抽象類,所謂抽象類是不會相應資料庫表的,一般我們用它來歸納一些公共屬性欄位,然后繼承它的子類能夠繼承這些欄位, |
|
permissions |
permissions主要是為了在Django Admin管理模塊下使用的,設定這個屬性能夠讓指定的方法權限描寫敘述更清晰可讀, |
| ordering | 這個欄位是告訴Django模型物件回傳的記錄結果集是依照哪個欄位排序的, |
在此,補充一個model的知識點,與Meta無關,就是__str__(self)方法,可以在模型類中定義__str__方法,自定義QuerySet中的輸出格式,這樣可視化程度更高,方便除錯,
21.ORM--操作
基本操作包括增刪改查操作,即CRUD操作,
CRUD是指在做計算處理時的增加(Create)、讀取查詢(Read)、更新(Update)和洗掉(Delete),
ORM CRUD 核心--> 模型類.管理器物件,
每個繼承自models.Model的模型類,都會有一個objects物件被同樣繼承下來,這個 物件叫管理器物件,
資料庫的增刪改查可以通過模型的管理器實作,
class MyModel(models.Model): .... MyModel.objects.create(...) ##objects 是管理器物件
創建資料
Django ORM 使用一種直觀的方式把資料庫表中的資料表示成Python物件,
創建資料中每一條記錄就是創建一個資料物件,
方案1
MyModel.objects.create(屬性1=值1,屬性2=值2)
成功:回傳創建好的物體物件;失敗:拋出例外,
方案2
創建MyModel實體物件,并呼叫save()進行保存,
obj = MyModel(屬性=值,屬性=值)
obj.屬性=值
obj.save()
22.查詢簡介
資料庫的查詢需要使用管理器物件進行,通過MyModel.objects管理方法呼叫查詢方法,
| 查詢方法 | 用法 | 作用 | 等同于SQL | 回傳值 | 簡單舉例 |
| all() | MyModel.objects.all() | 查詢MyModel物體中所有所有的資料, | select*from table | QuerySet 容器物件[類似陣列],內部存放MyModel實體 |
books =Book.objects.all() for book in books: print("書名",book.title,'出版社:' book.pub) |
| values(’列1‘,’列2‘) | MyModel.objests.values(...) | 查詢部分列的資料并回傳 | select列1,列2 from table |
QuerySet.回傳查詢結果容器,容器記憶體字典,每個字典代表一條資料,格式為:{’列1‘:值1,’列2‘:值2} |
a2=Book.objects.values('title','pub') for book in a2 print(book[title]) |
| values_list('列1','列2'...) | MyModel.objects.values_list(...) | 回傳元組形式的查詢結果 | select 列1,列2 from table | QuerySet 容器物件,內部存放’元組‘,會將查詢出來的資料封裝到元組中,再封裝到查詢集合QuerySet中, |
a3 = Book.objects.values_list('title','pub') for book in a3: print(book[0]) |
| order_by() | MyModel.objects.order_by('-列','列') | 與all()方法不同,它會用sql陳述句的order by 子句對查詢結果進行根據指定欄位選擇性的進行排序, |
默認是按照升序排序,降序排序則需要在列前增加’-‘表示, 可以和其它查詢方法組合使用, |
||
| filter(條件) | MyModel.objects.filter(屬性1=值1,屬性2=值2) | 回傳符合此條件的全部的資料集 | QuerySet容器物件,內部存放MyModel實體 |
當多個屬性在一起時為”與“關系, books = Book.objects.filter(pub="清華大學出版社") for book in books: print("書名",book.title) |
|
| exclude(條件) | MyMOdel.objects.exclude(條件) | 回傳不包含(不符合)此條件的全部的資料集 |
books = models.Book.objects.exclude(pub=”清華大學出版社“,price=50) for book in books: print(book) |
||
| get(條件) | MyModel.objects.get(條件) | 回傳滿足條件的唯一一條資料 |
該方法只能回傳一條資料,查詢結果多余一條資料則拋出例外--Model.MultipleObjectsReturned例外,查詢結果如果沒有資料則拋出Model.DoesNotExist例外, |
23.查詢謂詞
定義:做更靈活的條件查詢時需要使用查詢謂詞,
說明:每一個查詢謂詞是一個獨立的查詢功能,
| 查詢謂詞 | 功能 | 舉例 |
| __exact | 等值匹配 |
Book.objects.filter(id__exact=1) ##等同于select * from books where id =1 |
| __contains |
包含指定值. __startswith:以XXX開始; __endswith:以XXX結束, |
Author.objects.filter(name__contains='w') ##等同于 select * from author where name like '%w%' |
| __gt |
大于指定值; __gte:大于等于; __lt:小于 __lte:小于等于 |
Author.objects.filter(age__gt=50) ##等同于 select * from author where age>50 |
| __in | 查找資料是否在指定范圍內 |
Author.objects.fileter(country__in=['中國','韓國','越南']) ##等同于select * from author where country in ('中國','韓國',越南'') |
| __range | 查找資料是否在指定的時間范圍內 |
Author.objects.filter(age__range=(35,50)) ##等同于 select * from author where age between 35 and 50 |
24 ORM 更新操作
更新單個資料
修改單個物體的某些欄位的步驟:
step 1. 查
通過get()等到要修改的物體物件;
step 2 改
通過 物件.屬性 的方式 修改資料
step 3 保存
通過物件.save()保存資料
批量更新資料
直接呼叫QuerySet的update(屬性=值)實作批量修改,
例如
##將id大于3的所有圖書價格定為0元 books =Book.objects.filter(id__gt=3) books.update(price=0) ##回傳成功執行影響的行數
25.ORM--洗掉操作
單個資料洗掉
步驟
step 1 查找
查詢對應的資料物件
step 2 洗掉
呼叫這個資料物件的delete()方法進行洗掉,
try: auth=Author.objects.get(id=1) auth.delete() except: print(洗掉失敗)
批量洗掉
step 1 查找
查詢結果集中滿足條件的全部QuerySet查詢集合物件
step 2 呼叫查詢集合物件的delete()方法實作洗掉
##洗掉全部作者中,年齡大于65的全部資訊 auths = Author.objects.filter(age__gt=65) auths.delete()
26 F物件
定義:一個F物件代表資料庫中某條記錄的欄位的資訊,
作用:通常是對資料庫中的欄位值在不獲取的情況下進行操作,用于類屬性(欄位)之間的比較,
語法:
from django.db.models import F F('列名')
示例:
更新Book實體中所有的零售價漲10元,
如果不用F物件,如下:
books = Book.objects.all() for book in books: book.market_price=book.marget_price+10 book.save()
使用F物件,可以簡化如下:
Book.objects.all().update(market_price=F('market_price')+10)
實體2
對資料庫中兩個欄位的值進行比較,例如,列出那些書的零售價高于定價?
books = Book.objects.filter(market_price__gt=F('price')) for book in books: print(book.title,'定價:',book.price,'現價:',book.market_price)
27.Q物件
當在獲取查詢結果集,使用復雜的邏輯或|、邏輯非~等操作時,可以借助于Q物件進行操作,
如,想找出定價低于20元或中國機械出版社的全部書,可以寫成:
Book.objects.filter(Q(price__lt=20)|Q(pub="中國機械出版社"))
Q物件在資料包 django.db.models中,需要先匯入再使用,
運算子:
& 與操作
| 或操作
~ 非操作
from django.db.models import Q Q(條件1)|Q(條件2) ##表示需要 條件1成立或者條件2成立; Q(條件1)&Q(條件2) ##條件1和條件2同時成立; Q(條件1)&~Q(條件2) ##條件1成立且條件2不成立,
28.聚合查詢
整表聚合
不帶分組的聚合查詢是指將全部的資料進行集中統計查詢,
聚合函式需要從django.db.models匯入,常用的聚合函式:Sum、Avg、Count、Max、Min ---【注意:首字母大寫】,
語法:
MyModel.objects.aggregate(自定義的結果變數名=聚合函式('列'))
回傳結果:結果變數名和值組成的字典,格式為:{"結果變數名":值}
分組聚合
分組聚合是指通過計算查詢結果中每一個物件所關聯的物件集合,從而得出總計值值(當然也可以是平均值或總和),即為查詢集的每一項生成集合,
語法:
QuerySet.annotate(自定義結果變數名=聚合函式('列'))
回傳值:QuerySet,
簡單來講就是先通過MyModel.objects.values()進行查詢,然后通過.annotate分組,
29.原生資料庫操作
Django也支持之間用sql陳述句對資料庫進行查詢操作,
查詢:使用MyModel.objects.raw()進行資料庫查詢操作,
語法:
MyModel.objects.raw(sql陳述句,拼接引數)
回傳值:RawQuerySet集合物件【只支持基礎操作,比如回圈】
示例:
books = models.Book.objects.raw('select * from bookstore_book') for book in books: print(book)
使用原生陳述句時小心SQL注入,即 用戶通過資料上傳,將惡意的SQL陳述句提交給服務器,從而達到攻擊效果,
30.原生資料庫操作--cursor
可以支持查詢、更新、洗掉,
step 1 匯入cursor所在的包
from django.db import connection
step 2 用創建cursor類的建構式創建cursor物件,再使用cursor物件,為保證在出現例外時能釋放cursor資源,通常使用with陳述句進行創建操作,
from django.db import connection with connection.cursor() as cur: cur.execute('執行SQL陳述句','拼接引數')
31. admin管理后臺
注冊自定義模型類
若要自己定義的模型類也能在/admin后臺管理界面中顯示和管理,需要將自己的類注冊到后臺管理界面,
注冊步驟:
step 1.在應用app中的admin.py中匯入注冊要管理的模型models類,如:
from .models import Book
step 2.呼叫admin.site.register方法進行注冊,如
admin.site.register(自定義模型類)
模型管理器類
作用:為后臺管理界面添加便于操作的新功能,
說明:管理后臺類須繼承自django.contrib.admin里的ModelAdmin類,
使用方法
step 1.在<應用app>/admin.py里定義模型管理類
class xxxxManager(admin.ModelAdmin):
......
step 2 系結注冊模型管理器和模型類
from django.contrib import admin from .models import * admin.site.register(YYYY,xxxxmanager) ###系結YYYY模型類與管理器類xxxxManager
類xxxxManager 幾個常用的屬性
list_display = [] ##串列頁顯示那些欄位的列;即去控制那些欄位會顯示在Admind顯示串列中,
list_dispaly_links =[] ##控制list_display中的欄位,那些可以鏈接到修改頁;
list_filter=[] ##添加過濾器;即設定激活Admin修改串列頁面右側欄中的過濾器,
search_fields = [] ##添加搜索框;
list_editable = [] ##添加可在串列頁編輯的欄位,允許在更改串列頁面上直接進行欄位編輯,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/506525.html
標籤:其他
上一篇:python學習:三目運算子
下一篇:JVM學習 類加載子系統
