1. 程式人生 > >django框架基礎詳解 (一)

django框架基礎詳解 (一)

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
  1. 案例:

     # 定義模型
     # 注意: 執行遷移後,才會在資料庫自動建立對應的表
     #預設的表名為:  應用名_類名     類名會自動轉換成全小寫
          可以使用(內部類):
         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.訪問格式:  /應用名/路徑