Python Django進階教程(三)(模型的高階用法)

HuangZhang_123發表於2017-05-11

Django版本:1.11
作業系統:Windows
Python:3.5
歡迎加入學習交流QQ群:657341423


資料模型高階使用。這節主要講模型的使用。回顧一下基礎教程的模型設計
這裡寫圖片描述
這裡寫圖片描述
新建了三個表,分別Publisher,Author,Book。
其中Book有一個外來鍵(publisher)和多對多值(authors)分別對Publisher和Author構成一個關聯。
即Publisher<->Book<->Author
<->這個雙向狀態,可以通過Book分別與Publisher和Author的互通資料,但是Publisher不能跨越Book去查詢Author。因為兩者是沒有直接關聯的。


外來鍵例項:
資料庫資料:
Publisher:
這裡寫圖片描述

Author:
這裡寫圖片描述

Book:
這裡寫圖片描述

polls_book_authors:(關聯表,自動生成的)
這裡寫圖片描述

我們在專案執行:python manage.py shell
Book->Publisher,從Book查詢到Publisher
輸入程式碼:
這裡寫圖片描述
解釋:
首先匯入models裡面的類,作為一個物件型別。
看圖解釋:
這裡寫圖片描述
圖中1、b = Book.objects.get(id=1)建立一個Book物件並查詢id=1的資料。
圖中2、b.publisher這個publisher是Book裡面的欄位publisher,這個屬性是外來鍵。所以返回結果是Publisher裡面的資料。這裡我設定是2,即是Publisher的id為2的資料。
圖中3和4、因為 b.publisher沒有指定返回Publisher那個值,所以預設返回__str__ 裡面的返回值。

如果要返回其他值,如b.publisher.website即可。

Publisher->Book,從Publisher查詢到Book
我們知道,外來鍵在Book裡面,而Publisher是沒有外來鍵的。所以這裡Publisher->Book用法就和上面說的不一樣了。
看圖解釋:
這裡寫圖片描述
圖中1、p = Publisher.objects.get(name=‘luna’)建立一個Publisher物件並查詢name='luna’的資料。
圖2和3、p.book_set.all(),屬性名稱book_set是由模型名稱的小寫(如book)加_set組成的。查詢對應Book裡面的資料。all()是預設返回__str__ 裡面的返回值。
圖4、返回結果。

注意,這裡只能返回__str__ 裡面的返回值。如果返回資料是多條,可以用filter進行篩選。
這裡寫圖片描述
title__icontains:查詢欄位條件:欄位__icontains


訪問多對多值(Many-to-Many Values)
原理和外來鍵的大同小異,直接看教程即可。
這裡寫圖片描述


資料庫欄位增刪
如果要對資料庫的欄位進行增刪的話,要進行兩個操作。
1、對models.py進行增刪屬性
2、對資料庫欄位進行增刪。(可以sql語句或直接在視覺化工具操作即可)
總的來說,就是保持models和資料庫裡面的欄位一致就可以了。
注:models.py的欄位刪除了,資料庫的可以不刪除。但是反過來就不行了。
最後重啟伺服器就可以了。

其他刪除
這裡寫圖片描述

這裡寫圖片描述


這裡補充一下基礎知識的:models的get和filter區別。
看圖:
這裡寫圖片描述
這裡寫圖片描述
這裡寫圖片描述
models裡面是預設返回name欄位的。基礎教程是用p.all()是返回__str__ 預設返回值。但是實際中我們會需要其他欄位。沒理由將函式str每個值都寫進去的。
我們可以用p.city實現查詢其他欄位。
這裡get和filter,第一個返回一條資料,如果資料有2條就會報錯,filter是符合條件就返回,是一個list。如果要查詢city,應確定list位置再查詢需要查詢的欄位。


增加額外的manager方法,修manager返回的初始QuerySet。
這個作用就是可以根據個人實際對models的資料進行篩選和操作等。
增加額外的manager方法
這裡寫圖片描述
這裡寫圖片描述
這裡寫圖片描述

修改初始Manager QuerySets
這裡寫圖片描述


模型方法:可以在models.py宣告欄位之外,還可以根據實際寫方法。實際用法功能,與Manager 大同小異的。都屬於自定義。
這裡寫圖片描述
這裡寫圖片描述


執行原始SQL查詢
這裡寫圖片描述


總結:
1、基本上模型的高階用法,就是用過外來鍵,多對多這些資料庫設計進行跨表訪問資料。
2、資料庫和模型的欄位增加和刪除,這個分別對這兩項進行操作即可。
3、manager的額外增加和修改(重寫)manager。即對objects的方法定義和重寫。
4、models增加方法,這個和manager類似,只是manager在objects上,而這個直接對models的。
5、執行原始的Sql。

個人建議,如果要在models上新增方法,建議用第四點就好了,儘量不要用manager。


進階教程程式碼:請點選

相關文章