admin 后臺數(shù)據(jù)庫管理
- django 提供了比較完善的后臺管理數(shù)據(jù)庫的接口,可供開發(fā)過程中調用和測試使用
- django 會搜集所有已注冊的模型類焰枢,為這些模型類提拱數(shù)據(jù)管理界面关炼,供開發(fā)者使用
- 使用步驟:
- 創(chuàng)建后臺管理帳號:
- 后臺管理--創(chuàng)建管理員帳號
$ python3 manage.py createsuperuser
- 根據(jù)提示完成注冊,參考如下:
$ python3 manage.py createsuperuser Username (leave blank to use 'tarena'): tarena # 此處輸入用戶名 Email address: laowei@tedu.cn # 此處輸入郵箱 Password: # 此處輸入密碼(密碼要復雜些围来,否則會提示密碼太簡單) Password (again): # 再次輸入重復密碼 Superuser created successfully. $
- 后臺管理--創(chuàng)建管理員帳號
- 用注冊的帳號登陸后臺管理界面
- 后臺管理的登錄地址:
- 創(chuàng)建后臺管理帳號:
注冊自定義模型類
- 若要自己定義的模型類也能在
/admin
后臺管理界中顯示和管理痛垛,需要將自己的類注冊到后臺管理界面 - 添加自己定義模型類的后臺管理數(shù)據(jù)表的,需要用
admin.site.register(自定義模型類)
方法進行注冊- 配置步驟如下:
- 在應用app中的admin.py中導入注冊要管理的模型models類, 如:
from .models import Book
- 調用 admin.site.register 方法進行注冊,如:
from django.contrib import admin admin.site.register(自定義模型類)
- 在應用app中的admin.py中導入注冊要管理的模型models類, 如:
- 如: 在 bookstore/admin.py 添加如下代碼對Book類進行管理
- 示例:
# file: bookstore/admin.py from django.contrib import admin # Register your models here. from . import models ... admin.site.register(models.Book) # 將Book類注冊為可管理頁面
- 配置步驟如下:
修改自定義模型類的展現(xiàn)樣式
- 在admin后臺管理數(shù)據(jù)庫中對自定義的數(shù)據(jù)記錄都展示為
XXXX object
類型的記錄,不便于閱讀和判斷 - 在用戶自定義的模型類中可以重寫
def __str__(self):
方法解決顯示問題,如:- 在 自定義模型類中重寫 str(self) 方法返回顯示文字內容:
class Book(models.Model): ... def __str__(self): return "書名" + self.title
模型管理器類
-
作用:
- 為后臺管理界面添加便于操作的新功能粹淋。
-
說明:
- 后臺管理器類須繼承自
django.contrib.admin
里的ModelAdmin
類
- 后臺管理器類須繼承自
-
模型管理器的使用方法:
- 在
<應用app>/admin.py
里定義模型管理器類class XXXXManager(admin.ModelAdmin): ......
- 綁定注冊模型管理器和模型類
from django.contrib import admin from .models import * admin.site.register(YYYY, XXXXManager) # 綁定 YYYY 模型類與 管理器類 XXXXManager
- 示例:
# file : bookstore/admin.py from django.contrib import admin from .models import Book class BookManager(admin.ModelAdmin): list_display = ['id', 'title', 'price', 'market_price'] admin.site.register(Book, BookManager)
- 進入http://127.0.0.1:8000/admin/bookstore/book/ 查看顯示方式和以前有所不同
- 在
-
模型管理器類ModelAdmin中實現(xiàn)的高級管理功能
- list_display 去控制哪些字段會顯示在Admin 的修改列表頁面中吸祟。
- list_display_links 可以控制list_display中的字段是否應該鏈接到對象的“更改”頁面。
- list_filter 設置激活Admin 修改列表頁面右側欄中的過濾器
- search_fields 設置啟用Admin 更改列表頁面上的搜索框桃移。
- list_editable 設置為模型上的字段名稱列表欢搜,這將允許在更改列表頁面上進行編輯。
- 其它參見https://docs.djangoproject.com/en/2.2/ref/contrib/admin/
再談Meta類
通過Meta內嵌類 定義模型類的屬性
模型類可以通過定義內部類class Meta 來重新定義當前模型類和數(shù)據(jù)表的一些屬性信息
-
用法格式如下:
class Book(models.Model): title = CharField(....) class Meta: 1. db_table = '數(shù)據(jù)表名' - 該模型所用的數(shù)據(jù)表的名稱谴轮。(設置完成后需要立馬更新同步數(shù)據(jù)庫) 2. verbose_name = '單數(shù)名' - 給模型對象的一個易于理解的名稱(單數(shù)),用于顯示在/admin管理界面中 3. verbose_name_plural = '復數(shù)名' - 該對象復數(shù)形式的名稱(復數(shù)),用于顯示在/admin管理界面中
-
練習:
- 將Author 模型類加入后臺管理
- 制作一個AuthorManager管理器類,讓后臺管理Authors列表中顯示作者的ID吹埠、姓名第步、年齡信息
- 用后臺管理程序 添加三條 Author 記錄
- 修改其中一條記錄的年齡 - Author
- 刪除最后一條添加的記錄 - Author
數(shù)據(jù)表關聯(lián)關系映射
- 常用的表關聯(lián)方式有三種:
- 一對一映射
- 如: 一個身份證對應一個人
- 一對多映射
- 如: 一個班級可以有多個學生
- 多對多映射
- 如: 一個學生可以報多個課程,一個課程可以有多個學生學習
- 一對一映射
一對一映射
- 一對一是表示現(xiàn)實事物間存在的一對一的對應關系缘琅。
- 如:一個家庭只有一個戶主粘都,一個男人有一個妻子,一個人有一個唯一的指紋信息等
語法
class A(model.Model):
...
class B(model.Model):
屬性 = models.OneToOneField(A, on_delete=xxx)
外鍵類字段選項
-
特殊字段參數(shù)【必須項】:
- on_delete
- models.CASCADE 級聯(lián)刪除刷袍。 Django模擬SQL約束ON DELETE CASCADE的行為翩隧,并刪除包含F(xiàn)oreignKey的對象。
- models.PROTECT 拋出ProtectedError 以阻止被引用對象的刪除;[等同于mysql默認的RESTRICT]
- models.SET_NULL 設置ForeignKey null呻纹;需要指定null=True
- models.SET_DEFAULT 將ForeignKey設置為其默認值堆生;必須設置ForeignKey的默認值。
- ... 其它參請參考文檔 https://docs.djangoproject.com/en/2.2/ref/models/fields/#foreignkey
- on_delete
-
其余常用的字段選項【非必須項】雷酪;如:
- null
- unique 等
用法示例
- 創(chuàng)建作家和作家妻子類
# file : xxxxxxxx/models.py from django.db import models class Author(models.Model): '''作家模型類''' name = models.CharField('作家', max_length=50) class Wife(models.Model): '''作家妻子模型類''' name = models.CharField("妻子", max_length=50) author = models.OneToOneField(Author, on_delete=models.CASCADE) # 增加一對一屬性
- 創(chuàng)建一對一的數(shù)據(jù)記錄
from .models import * author1 = Author.objects.create(name='王老師') wife1 = Wife.objects.create(name='王夫人', author=author1) # 關聯(lián)王老師 author2 = Author.objects.create(name='小澤老師') # 一對一可以沒有數(shù)據(jù)對應的數(shù)據(jù)
- 數(shù)據(jù)查詢
-
正向查詢
- 直接通過關聯(lián)屬性查詢即可
# 通過 wife 找 author from .models import Wife wife = Wife.objects.get(name='王夫人') print(wife.name, '的老公是', wife.author.name)
-
反向查詢
- 通過反向關聯(lián)屬性查詢
- 反向關聯(lián)屬性為
實例對象.引用類名(小寫)
淑仆,如作家的反向引用為作家對象.wife
- 當反向引用不存在時,則會觸發(fā)異常
# 通過 author.wife 關聯(lián)屬性 找 wife,如果沒有對應的wife則觸發(fā)異常 author1 = Author.objects.get(name='王老師') print(author1.name, '的妻子是', author1.wife.name) author2 = Author.objects.get(name='小澤老師') try: print(author2.name, '的妻子是', author2.wife.name) except: print(author2.name, '還沒有妻子')
-
一對多映射
- 一對多是表示現(xiàn)實事物間存在的一對多的對應關系哥力。
- 如:一個學校有多個班級,一個班級有多個學生, 一本圖書只能屬于一個出版社,一個出版社允許出版多本圖書
-
語法
- 當一個A類對象可以關聯(lián)多個B類對象時
class A(model.Model): ... class B(model.Model): 屬性 = models.ForeignKey("一"的模型類, on_delete=xx)
-
用法示例
- 有二個出版社對應五本書的情況.
-
清華大學出版社
有書- C++
- Java
- Python
-
北京大學出版社
有書- 西游記
- 水滸
-
- 有二個出版社對應五本書的情況.
-
創(chuàng)建模型類
# file: otm/models.py from django.db import models class Publisher(models.Model): '''出版社【一】''' name = models.CharField('名稱', max_length=50, unique=True) class Book(models.Model): '''書【多】''' title = models.CharField('書名', max_length=50) publisher = ForeignKey(Publisher, on_delete=models.CASCADE)
-
創(chuàng)建數(shù)據(jù)
#先創(chuàng)建 '一' 蔗怠,再創(chuàng)建 '多' from .models import * pub1 = Publisher.objects.create(name='清華大學出版社') Book.objects.create(title='C++', publisher=pub1) Book.objects.create(title='Java', publisher_id=1) #高級創(chuàng)建 - 利用 反向屬性 pub2 = Publisher.objects.create(name='北京大學出版社') pub2.book_set.create(title='西游記')
-
數(shù)據(jù)查詢
通過 Book 查詢 Publisher【正向】
通過 publisher 屬性查詢即可 book.publisher abook = Book.objects.get(id=1) print(abook.title, '的出版社是:', abook.publisher.name)
通過 Publisher 查詢 對應的所有的 Book 【反向】
Django會在Publisher中增加一個屬性來表示對對應的Book們的查詢引用 屬性:book_set 等價于 objects # 通過出版社查詢對應的書 pub1 = Publisher.objects.get(name='清華大學出版社') books = pub1.book_set.all() # 通過book_set 獲取pub1對應的多個Book數(shù)據(jù)對象 #books = Book.objects.filter(publisher=pub1) # 也可以采用此方式獲取 print("清華大學出版社的書有:") for book in books: print(book.title)
多對多映射
- 多對多表達對象之間多對多復雜關系,如: 每個人都有不同的學校(小學吩跋,初中寞射,高中,...),每個學校都有不同的學生...
-
語法
- 在關聯(lián)的兩個類中的任意一個類中,增加:
屬性 = models.ManyToManyField(MyModel)
-
用法示例
- 一個作者可以出版多本圖書
- 一本圖書可以被多名作者同時編寫
class Author(models.Model): ... class Book(models.Model): ... authors = models.ManyToManyField(Author)
-
創(chuàng)建模型類
class Author(models.Model): '''作家模型類''' name = models.CharField('作家', max_length=50) def __str__(self): return self.name class Book(models.Model): '''書模型類''' title = models.CharField('書名', max_length=50) authors = models.ManyToManyField(Author) def __str__(self): return self.title
-
創(chuàng)建數(shù)據(jù)
方案1 先創(chuàng)建 author 再關聯(lián) book author1 = Author.objects.create(name='呂老師') author2 = Author.objects.create(name='王老師') # 呂老師和王老師同時寫了一本Python book11 = author1.book_set.create(title="Python") author2.book_set.add(book11) 方案2 先創(chuàng)建 book 再關聯(lián) author book = Book.objects.create(title='python1') #郭小鬧和呂老師都參與了 python1 的 創(chuàng)作 author3 = book.authors.create(name='guoxiaonao') book.authors.add(author1)
-
數(shù)據(jù)查詢
- 通過 Book 查詢對應的所有的 Author【正向】
book.authors.all() -> 獲取 book 對應的所有的author的信息 book.authors.filter(age__gt=80) -> 獲取book對應的作者中年齡大于80歲的作者的信息
- 通過 Author 查詢對應的所有的Book【反向】
- Django會生成一個反向屬性 book_set 用于表示對對應的book的查詢對象相關操作
author.book_set.all() author.book_set.filter()
cookies 和 session
- 會話 - 從打開瀏覽器訪問一個網(wǎng)站,到關閉瀏覽器結束此次訪問锌钮,稱之為一次會話
- HTTP協(xié)議是無狀態(tài)的桥温,導致會話狀態(tài)難以保持
- 試想一下,如果不保持會話狀態(tài)梁丘,在電商網(wǎng)站購物的場景
體驗策治?
Cookies和Session就是為了保持會話狀態(tài)而誕生的兩個存儲技術
cookies
cookies是保存在客戶端瀏覽器上的存儲空間
Chrome 瀏覽器 可能通過開發(fā)者工具的
Application
>>Storage
>>Cookies
查看和操作瀏覽器端所有的 Cookies 值-
火狐瀏覽器 可能通過開發(fā)者工具的 存儲 -> Cookie
cookies 在瀏覽器上是以鍵-值對的形式進行存儲的脓魏,鍵和值都是以ASCII字符串的形存儲(不能是中文字符串)
cookies中的數(shù)據(jù)是按域存儲隔離的,不同的域之間無法訪問
cookies 的內部的數(shù)據(jù)會在每次訪問此網(wǎng)址時都會攜帶到服務器端通惫,如果cookies過大會降低響應速度
-
在Django 設置瀏覽器的COOKIE 必須通過 HttpResponse 對象來完成
-
添加茂翔、修改COOKIE
- HttpResponse.set_cookie(key, value='', max_age=None, expires=None)
- key:cookie的名字
- value:cookie的值
- max_age:cookie存活時間,秒為單位
- expires:具體過期時間
- 當不指定max_age和expires 時,關閉瀏覽器時此數(shù)據(jù)失效
- HttpResponse.set_cookie(key, value='', max_age=None, expires=None)
-
刪除COOKIE
- HttpResponse.delete_cookie(key)
- 刪除指定的key 的Cookie履腋。 如果key 不存在則什么也不發(fā)生珊燎。
-
獲取cookie
-
通過 request.COOKIES 綁定的字典(dict) 獲取客戶端的 COOKIES數(shù)據(jù)
value = request.COOKIES.get('cookies名', '默認值') print("cookies名 = ", value)
-
-
-
示例
- 以下示例均在視圖函數(shù)中調用
- 添加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
- 刪除cookie
# 刪除瀏覽器鍵為 my_var1的cookie responds = HttpResponse("已刪除 my_var1") responds.delete_cookie('my_var1') return responds
- 獲取cookie
# 獲取瀏覽器中 my_var變量對應的值 value = request.COOKIES.get('my_var1', '沒有值!') print("cookie my_var1 = ", value) return HttpResponse("my_var1:" + value)
session
session又名會話控制悔政,是在服務器上開辟一段空間用于保留瀏覽器和服務器交互時的重要數(shù)據(jù)
-
實現(xiàn)方式
- 使用 session 需要在瀏覽器客戶端啟動 cookie,且用在cookie中存儲sessionid
- 每個客戶端都可以在服務器端有一個獨立的Session
- 注意:不同的請求者之間不會共享這個數(shù)據(jù)延旧,與請求者一一對應
-
Django中配置Session
- 在 settings.py 文件中
- 向 INSTALLED_APPS 列表中添加:
INSTALLED_APPS = [ # 啟用 sessions 應用 'django.contrib.sessions', ]
- 向 MIDDLEWARE 列表中添加:
MIDDLEWARE = [ # 啟用 Session 中間件 'django.contrib.sessions.middleware.SessionMiddleware', ]
-
session的基本操作:
- session對于象是一個類似于字典的SessionStore類型的對象, 可以用類擬于字典的方式進行操作
- session 只能夠存儲能夠序列化的數(shù)據(jù),如字典谋国,列表等。
-
保存 session 的值到服務器
request.session['KEY'] = VALUE
-
獲取session的值
VALUE = request.session['KEY']
VALUE = request.session.get('KEY', 缺省值)
-
刪除session的值
- del request.session['KEY']`
-
在 settings.py 中有關 session 的設置
- SESSION_COOKIE_AGE
- 作用: 指定sessionid在cookies中的保存時長(默認是2周)迁沫,如下:
SESSION_COOKIE_AGE = 60 * 60 * 24 * 7 * 2
- SESSION_EXPIRE_AT_BROWSER_CLOSE = True
設置只要瀏覽器關閉時,session就失效(默認為False)
- SESSION_COOKIE_AGE
注: 當使用session時需要遷移數(shù)據(jù)庫,否則會出現(xiàn)錯誤
python3 manage.py migrate
django 原生session 問題:
1芦瘾,django_session表是 單表設計; 且該表數(shù)據(jù)量持續(xù)增持【瀏覽器故意刪掉sessionid&過期數(shù)據(jù)未刪除】
2集畅,可以每晚執(zhí)行 python3 manage.py clearsessions 【該命令可刪除已過期的session數(shù)據(jù)】
Cookies vs session
存儲位置:
C- 瀏覽器中 s- 服務器中【mysql】
安全性:
C - 不安全 s- 相對安全一些
不管C還是S , 不要存儲敏感數(shù)據(jù) 【密碼】