django框架基礎詳解 (一)
阿新 • • 發佈:2018-11-01
django框架(一)
一、基本資訊及demo
1、虛擬環境下 安裝django
pip install django==1.11.16
2.檢查django是否安裝成功 1. pip list 2.進入互動模型 import django django.get_version() 檢視到對應版本,則證明安裝成功 3.建立django專案 1、建立django工程 django-admin startproject 專案名 進入到專案目錄下 執行 python manage.py runserver 可以開啟伺服器,開啟後再瀏覽器中可以訪問;本地訪問 2.建立一個應用(在專案目錄下開啟) python manage.py startapp 應用名 3.pycharm開啟選擇manage.py的父目錄開啟即可 3.專案下各目錄及.py介紹 1.app --- 應用名, 可以自定義,也可以建立,可以建立多個(小專案) 1.migrations 目錄, 遷移目錄,是自動生成的,通常是生成資料庫表的時候產生中間檔案 2.__init__.py 初始化包的時候呼叫,是一個包的標識 3.admin.py 管理專案資料庫的 4.apps 管理應用的 **5.models.py models資料模型, 通常用來方便的操作資料庫 6.tests.py 測試的時候用, 往往開發完成的時候測試人員使用 **7.views.py 檢視函式, 通常用來處理業務邏輯 python程式碼 2.week01--- 專案名, 放置管理整個專案的一些配置檔案 1.setting.py 整個專案的配置 **2.urls.py 路由, 用來分發請求的url,將對應的url分發到對應views處理 3. wsgi.py 是uwsgi伺服器的配置檔案,開發完成上線的時候使用 3.db.sqlite3 資料庫 4.manage.py 專案的配置檔案,通常啟動,生成資料庫的時候使用,自動生成的自己建立的 **5.templates目錄模板,通常用來放置html模板 4.settting 檔案介紹 BASE_DIR : 專案的跟路徑 DEBUG : 是否開啟除錯模式, 開發的時候開啟, True 開啟,false關閉 ALLOWED_HOSTS: 允許訪問的主機地址, 預設只能本機訪問, ["*"] 表示所有的地址都可以訪問 INSTALLED_APPS 已經安裝的應用, 注意: 自己建立的應用需要新增進去 MIDDLEWARE 中間健 TEMPLATES 模板檔案的配置 DATABASES 配置資料庫的 LANGUAGE_CODE 配置語言的 中文: "zh-hans" TIME_ZONE 配置時區的 中國: "Asia/Shanghai" STATIC_URL 配置靜態資源的 5.外網訪問開發伺服器 1.如果是宿主機訪問虛擬機器需要設定網路 為 橋接模式 2.啟動伺服器: 1.在setting中設定 ALLOWED_HOSTS為 ["*"] 2.使用 python manage.py runserver 0.0.0.0:埠號 2018/9/10來開啟 則即可使用外網訪問 **命令 : python manage.py runserver 表示預設只能自己訪問 6.demo-helloworld 流程: urls ----> views 檢視函式 ----> template html檔案 --->views 檢視函式響應 開發流程: 倒著來 目的 1.template 模板中寫到要展示的html網頁 2.views 檢視函式中響應一個html, 如: return render(request,"模板名") 3.urls 將url路徑與檢視函式對應即可 3.model 模型 作用: model模型, 通常用來方便的操作資料庫: 1.可以方便的建立表 2.方便的增刪改查 3.可以方便的在views中使用 1.設計表: 欄位1,欄位2,....... ---> sql: create table 表名(欄位 欄位型別,........) 在django中直接寫對應model模型,就可以自動的生成表 如: # 定義一個學生類 # 注意: modle中定義的類需要繼承 models.Model class Student(models.Model): s_name = models.CharField(max_length=50) s_age = models.IntegerField(default=18) 2.需要執行遷移才能自動生成對應的表 1.生成遷移檔案 命令: python manage.py makemigrations 2.執行遷移檔案 命令: python manage.py migrate 3.執行遷移後,重新整理後就可以看到自動建立的表 注意;首次執行遷移時,還會建立django專案需要的表 3.如何連線資料庫: pycharm 右側----->database ---> + ---->import from source ---->test connect 如果不能點,需要點選下方的downlosd下載對應的驅動,--->再點選test connect--->成功後確定即可連線上 4.如何使用pycharm管理資料庫 1.雙擊表名可以檢視 表的所有資料 2.插入/刪除 一條資料 點選表的上方的 +/-按鈕, 注意操作完後必須提交(db綠色向上箭頭)才可生效 3.注意:pycharm的資料操作後不會自動的重新整理,開發測試資料的時候,需要手動重新整理,來檢視資料 4.ddl按鈕可以查看錶的建立語句 5.黑色圖示的按鈕, ---> new console --->可以輸入sql語句 --->綠色按鈕是執行 可以方便的操作資料庫
二、MVC/MTV
M — model 資料模型層
作用:方便的操作資料庫
1.連線資料庫 ---- mysql,sqlserver, oracle…
0.django預設只能連線關係型資料庫
1.安裝依賴的庫
可以使用的庫: 1. pymysql 2.python_mysql(不穩定) 3.mysqlclient(配置麻煩) 安裝pymsql: pip install pymysql 如果出現 timeout 超時可以使用其他的資源下載: pip install 模組名 -i https://pypi.douban.com/simple 2. 匯入庫 在 __init__檔案中編寫: # 匯入pymysql模組 import pymysql pymysql.install_as_MySQLdb()
3.在setting的database中配置mysql的連線
'ENGINE': 'django.db.backends.mysql', 設定驅動 'NAME':"week01", 設定資料庫名 'USER':'root', 設定使用者名稱 'PASSWORD':'123', 設定密碼 'HOST':'localhost', 設定主機地址 'PORT':3306, 設定埠號 **4.注意:不要忘記了在資料庫中建立該庫 create database 資料庫名 charset='utf8'; 5.連線mysql資料庫 點選左側database --- + -----data source ----資料庫型別(如:mysql) ----- 設定 賬號,密碼,主機,(注意: 如果對mysql設定遠端連線,需要使用遠端連線的賬號密碼) ----test connect ---- successful 即可 6.測試程式能否能連 1.執行遷移 python manage.py makemigrations python manage.py migrate 2.看到自動生成的表即可
2.orm 物件關係隱射 — 思想:相當於一個翻譯機
object relational mapping
1.開發人員不要寫複雜的sql語句,直接呼叫對應的方法即可
2.開發人員不需要封裝查詢結果,查詢結果直接就是物件,可以直接使用
3.如果開發人員需要跟換資料庫, 不需要更改任何的程式碼,直接修改資料庫的連線即可
3.建立一個表
1.需要在model模組中建立一個類,注意該類必須繼承 models.Model,
注意: 表名預設是 應用名_類名
2.定義屬性名 ---屬性需要與表中欄位對應
欄位名即屬性名
欄位的資料型別
欄位的約束型別
·django根據屬性的型別確定以下資訊
·當前選擇的資料庫支援欄位的型別
·渲染管理表單時使用的預設html控制元件
·在管理站點最低限度的驗證
·django會為表增加自動增長的主鍵列,每個模型只能有一個主鍵列,如果使用選項設定某屬性為主鍵列後,則django不會再生成預設的主鍵列
·屬性命名限制
·遵循識別符號規則
·由於django的查詢方式,不允許使用連續的下劃線
庫
·定義屬性時,需要欄位型別,欄位型別被定義在django.db.models.fields目錄下,為了方便使用,被匯入到django.db.models中
·使用方式
·匯入from django.db import models
·通過models.Field建立欄位型別的物件,賦值給屬性
邏輯刪除
·對於重要資料都做邏輯刪除,不做物理刪除,實現方法是定義isDelete屬性,型別為BooleanField,預設值為False
欄位型別
·AutoField
·一個根據實際ID自動增長的IntegerField,通常不指定如果不指定,一個主鍵欄位將自動新增到模型中
·CharField(max_length=字元長度)
·字串,預設的表單樣式是 TextInput
·TextField
·大文字欄位,一般超過4000使用,預設的表單控制元件是Textarea
·IntegerField
·整數
·DecimalField(max_digits=None, decimal_places=None)
·使用python的Decimal例項表示的十進位制浮點數
·引數說明
·DecimalField.max_digits
·位數總數
·DecimalField.decimal_places
·小數點後的數字位數
·FloatField
·用Python的float例項來表示的浮點數
·BooleanField
·true/false 欄位,此欄位的預設表單控制是CheckboxInput
·NullBooleanField
·支援null、true、false三種值
·DateField([auto_now=False, auto_now_add=False])
·使用Python的datetime.date例項表示的日期
·引數說明
·DateField.auto_now
·每次儲存物件時,自動設定該欄位為當前時間,用於"最後一次修改"的時間戳,它總是使用當前日期,預設為false
·DateField.auto_now_add
·當物件第一次被建立時自動設定當前時間,用於建立的時間戳,它總是使用當前日期,預設為false
·說明
·該欄位預設對應的表單控制元件是一個TextInput. 在管理員站點添加了一個JavaScript寫的日曆控制元件,和一個“Today"的快捷按鈕,包含了一個額外的invalid_date錯誤訊息鍵
·注意
·auto_now_add, auto_now, and default 這些設定是相互排斥的,他們之間的任何組合將會發生錯誤的結果
·TimeField
·使用Python的datetime.time例項表示的時間,引數同DateField
·DateTimeField
·使用Python的datetime.datetime例項表示的日期和時間,引數同DateField
·FileField
·一個上傳檔案的欄位
·ImageField
·繼承了FileField的所有屬性和方法,但對上傳的物件進行校驗,確保它是個有效的image
欄位選項
·概述
·通過欄位選項,可以實現對欄位的約束
·在欄位物件時通過關鍵字引數指定
·null
·如果為True,Django 將空值以NULL 儲存到資料庫中,預設值是 False
·blank
·如果為True,則該欄位允許為空白,預設值是 False
·注意
·null是資料庫範疇的概念,blank是表單驗證證範疇的
·db_column
·欄位的名稱,如果未指定,則使用屬性的名稱
·db_index
·若值為 True, 則在表中會為此欄位建立索引
·default
·預設值
·primary_key
·若為 True, 則該欄位會成為模型的主鍵欄位
·unique
·如果為 True, 這個欄位在表中必須有唯一值
關係
·分類
·ForeignKey:一對多,將欄位定義在多的端中
·ManyToManyField:多對多,將欄位定義在兩端中
·OneToOneField:一對一,將欄位定義在任意一端中
·用一訪問多
·格式
·物件.模型類小寫_set
·示例
grade.students_set
·用一訪問一
·格式
·物件.模型類小寫
·示例
·grade.students
·訪問id
·格式
·物件.屬性_id
·示例
·student.sgrade_id
-
案例:
# 定義模型 # 注意: 執行遷移後,才會在資料庫自動建立對應的表 #預設的表名為: 應用名_類名 類名會自動轉換成全小寫 可以使用(內部類): class Meta: db_table = "表名" 修改表名 # 預設的欄位名 就是 定義的屬性名, 可以使用 db_column = "欄位名" 來修改欄位名 # 預設會自動建立主鍵id,如果使用AutoField則不會自動建立 class Person(models.Model): p_name = models.CharField(max_length=20,null=False,unique=True) p_age = models.IntegerField(default=10) p_sex = models.BooleanField(default=True) # .... # 表的結構是可以修改的,修改後,需要重新的遷移才能生效,最好不要修改 # 注: 會自動的檢測那些屬性進行了修改
4.增加一個數據 view裡建立一個函式,例項化
1.建立一個物件
2.設定屬性
3.儲存資料
物件名.save()
5.刪除資料— delete from 表名 whree 條件
0.要刪除資料,前提條件是先查詢到對應的資料
1.刪除:
# 可以直接刪除多個結果,也可以直接刪除一個
查詢結果.delete()
6.修改資料 ---- update 表名 set 欄位名=資料,… where 條件
0.要修改資料,前提條件也是先查詢到對應的資料
1.修改:
物件名.屬性名 = 值
物件名.save()
7.查詢資料
1.查詢方法 格式: 類名.objects.方法 ----支援鏈式呼叫
1.有多條結果的
all() 獲取所有的結果
filter(條件) 按照條件篩選資料
exclude(條件) 篩選出滿足條件以外的資料
2.有單個結果的
first() 獲取結果集的第一個
last() 獲取結果集的最後一個
get() 獲取一個結果, 注意: 有且只有一個結果的時候使用get()才可以,如果結果超過一個或者沒有,程式都出錯
3.其他
count() 獲取結果集的數量
order_by("-屬性名") 表示按照屬性名對應的值排序, 預設是升序, -屬性名錶示降序排序
如果是字元型別的資料,是按照字元對應的碼錶來排序的,一個字元一個字元的的比較,如: "aac" "abc" ,"aac"小,
exists() 判斷查詢結果集中是否有資料
values() 獲取結果集的資料,該資料是類似字典的形式,方便操作
2.條件中的運算子
格式: 屬性名__運算子=值 是2個下劃線
運算子:
gt 大於
gte 大於等於
lt 小於
lte 小於等於
= 等於 exact
不等於 exclude(條件)
isNull 是空的資料
startwith 查詢以某個字元開始
endwith 查詢以某個字元結尾的
contain 查詢包含某個字元的
istartwith i 是ignore的簡寫, 忽略大小寫查詢
iendwith
icontain
in 成員運算子, 是否是集合中值的其中一個,滿足一個就符合條件
特使用法** pk=值 pk是主健的簡寫
3.Q與F物件
1.Q物件, 用來幫助實現 邏輯運算子
& 且 如: ...filter(Q(p_age__gt=90)&Q(p_age__lt=95)) 注意導包
| 或 如: ....filter(Q(p_name="三胖胖40") | Q(p_name="三胖胖61"))
~ 非 如: ....filter(~Q(p_age__lte=100))
2.F 物件, 用來幫助自己的屬性與自己的屬性比較
如:
# 需求:實現年齡比id小的資料
persons = Person.objects.filter(p_age__lt=F("id"))
4.查詢結果的切片
格式: 結果集[start:stop] 包前不包後 擷取從start位置到stop位置的資料
5.聚合函式的使用
Max
Min
Avg
Sum
注意: 1.大小寫 2.注意到包
如:
# 求年齡最大的
# res = Person.objects.all().aggregate(Max("p_age"))
res = Person.objects.all().aggregate(Min("p_age"))
如何將urls中的內容分離 ?
1.問題: 如果所有的urls路由都寫在專案下的urls中,難以管理,不同應用之間還可能出現衝突
2.解決: 將專案的urls 中的內容分離
3.如何分離:
1.在應用目錄下建立一個urls.py,程式碼與專案下的urls類似
2.在應用下的urls中可以新增自己引用對應的路由
如: url("路徑",對應的檢視函式)
3.還需要在專案的urls中新增應用的urls
如: url("應用名",include("應用名.urls"))
注意:1.倒包 2.注意引號 3.注意 /
4.訪問格式: /應用名/路徑