Python Django進階教程(三)(模型的高階用法)
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。
相關文章
- Python進階:切片的誤區與高階用法Python
- 【Python學習教程】Python的5種高階用法!Python
- Python字典的高階用法Python
- 高階前端進階(三)前端
- Python——迭代器的高階用法Python
- React 進階(三) 高階元件React元件
- Pandas高階教程之:GroupBy用法
- Python裝飾器高階用法Python
- python str.format高階用法PythonORM
- 02 . SaltStack高階用法(Python API)PythonAPI
- 【狂神說】Docker(三) - 高階進階Docker
- Python 函式進階-高階函式Python函式
- Python後臺開發(第三章: Django高階)PythonDjango
- hyperf 教程之 hyperf-auth 高階用法
- Nginx 高階用法Nginx
- play高階用法
- Python3影片零基礎進階高階運維Django爬蟲專案實戰2017全套教程Python運維Django爬蟲
- 【模組三】Python高階Python
- printf 進階用法
- Python函式裝飾器高階用法Python函式
- Python的 5 種高階用法,效率提升沒毛病!Python
- Django 進階之 celeryDjango
- Django進階之路(一)Django
- 高階前端進階(七)前端
- 高階前端進階(五)前端
- Python技法2:函式引數的進階用法Python函式
- python入門與進階篇(六)之高階語法及用法Python
- Django高階之-快取Django快取
- [Django高階之forms元件]DjangoORM元件
- SpringCloud基礎教程(三)-Eureka進階SpringGCCloud
- curl與wget高階用法wget
- gojs 實用高階用法GoJS
- Newtonsoft.Json高階用法JSON
- 高階前端的進階——CSS之flex前端CSSFlex
- 高階 Android 工程師的進階之路Android工程師
- Python進階教程5——物件導向Python物件
- Typescript 高階語法進階TypeScript
- 高階前端進階系列 - webview前端WebView
- Flutter 中漸變的高階用法Flutter