ORM建立外鍵
一對多 Foreignkey(to='建立外鍵關聯的表名',to_field='這個是外鍵關聯的字段')to_field若是不填的話,默認是將關聯的表的主鍵做爲關聯的外鍵字段 多對多 ManyToManyField(to=..) 這個不會建立外鍵字段,僅僅是告訴django幫咱們生成多對多關係的第三張表。 一對一 OneToOneField(to=..)這個是一對一的和一對多同樣 補充:一對多和多對一會在外鍵字段建立完成後給外鍵字段加個_id後綴。
Django請求生命週期看圖
路由層:
路由匹配規律:
url()方法,第一個參數實際上是一個正則表達式。html
一旦前面的正則表達式匹配到了內容,便不會繼續匹配下去,而是去執行相對應的視圖函數前端
正是由於有這種特性,當你的項目特別大的時候,url的先後要注意,否則會出現url錯亂的問題。python
url(r"^$")這個是匹配網站首頁的url,url(r'')這個是匹配url不存在的時候。git
django在匹配路由的時候,當你在瀏覽器沒有敲最後的斜槓的時候,其第一次過來後端識別不了,讓其加個斜槓再過來試試,第二次加了斜槓再來的時候,成功識別,就將數據成功返回了,若是想取消這個斜槓機制的話,就要在settings這個配置文件裏面寫APPEND_SLASH = False 默認是True,改False就ok,就取消斜槓的機制了。正則表達式
無名分組:
url(r'test/(\d+)/',views.test),這個就是一個無名分組,就是將括號內正則表達式匹配到的內容看成位置參數傳遞給相應的視圖函數。 test(request,2019)
有名分組
url(r'^test/(?P<正則表達式匹配到的內容起的名字>\d+)/', views.test) 就是把括號內正則表達式匹配到的內容看成一個關鍵字參數傳遞給對應的視圖函數。 test(request,year=2019)
注意:無名分組和有名分組不能混合使用,但能夠一種連續使用。django
反向解析:
就是經過名字動態獲取對應的路徑json
本質:就是給你返回一個可以返回對應的url地址後端
操做:
1.先給url和視圖函數對應關係起別名瀏覽器
url(r'^index/$',views.index,name='kkk')
2.反向解析app
後端反向解析:
後端能夠在任何位置經過reverse這個模塊獲取相對應的url。
from django.shortcuts import render,HttpResponse,redirect,reverse reverse('起的別名')
前端反向解析:
前端要用到模板語法
{% url '別名' %}
無名分組反向解析
url(r'^index/(\d+)/$',views.index,name='kkk')
後端反向解析:
reverse('別名',args=(1,)) #後面的這個args一般是數據的id值
前端反向解析:
{% url '別名' 1 %} # 後面的值一般都是數據的id值
有名分組反向解析:
url(r'^index/(?P<year>\d+)/$',views.index,name='kkk') 後端反向解析: reverse('別名',kwargs={'year': 1}) 或reverse('kkk',args=(1,))#推薦這一種方便 前端反向解析: {% url '別名' year=10 %}或{% url '別名' 10 %}推薦這個
那麼有名分組反向解析方法和無名分組方法同樣,爲了就是減小你的腦容量。
注意:同一個應用下,別名千萬不要重複。
路由分發:
當你的項目特別大的時候,路由與視圖函數對應關係愈來愈多的時候,所有放在總路由urls.py這個文件的時候,會形成代碼冗餘。 這個時候我就應該讓個人每個app均可以擁有本身的urls.py,static,template文件夾。這樣個人總路由就不作路由匹配 ,只作一個引路人。 urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^app01/',include('app01.urls')), url(r'^app02/',include('app02.urls')), ] 經過include這個模塊裏面直接指定app的urls文件,當輸入app01,我進app01的urls,這樣我總路由的壓力就會減小不少,由於只作分配,不作匹配。
名稱空間
當個人多個app起了相同的別名,這個時候用反向解析就沒有用了,這個時候就須要指定一個namespace參數,是來自哪一個app的
總路由 url(r'^app01/',include('app01.urls',namespace='app01')) url(r'^app02/',include('app02.urls',namespace='app02')) 後端解析的時候 reverse('app01:index') reverse('app02:index') 前端解析的時候 {% url 'app01:index' %} {% url 'app02:index' %}
方式2:
就不要起相同的別名就ok啦
僞靜態:
靜態:就是寫死的,萬年不變的
僞靜態網頁的設計就是爲了增長搜索引擎的查詢力度。
全部的搜索引擎其實就是一個龐大的爬蟲程序。
網站優化相關,經過僞靜態可讓你的網站被查詢力度提升,好比加個後綴.html但其實不是靜態就是假裝的。
虛擬環境
就是爲每一個項目量身定作的解釋器環境
每開啓一個虛擬環境,都等於下了一遍python解釋器,也是耗資源的。
Django版本的區別(1.x和2.x)
路由層1.x用的是url
2.x用的是path
2.xpath裏面的第一個參數不是正則表達式,而是寫什麼就匹配什麼,精準匹配。
固然2.x裏面也有一個re_path也能夠匹配正則表達式
雖然2.X中path不支持正則表達式 可是它提供了五種默認的轉換器: 1.x的url和2.x的re_path匹配出來的都是字符串 其有5種轉換器 1.str,匹配除路徑分隔符(/)之外的非空字符串,默認就是 2.int ,匹配正整數,包括0 3.slug,匹配字母,數字,橫線,下劃線組成的字符串 4uuid,匹配格式化的uuid,好比075194d3-6885-417e-a8a8-6c931e272f00 5path,匹配任意非空字符串,包含了路徑分隔符(/),但不能用(?)
path('index/<int:id>/',index) # 會將id匹配到的內容自動轉換成整型
還支持自定義轉換器
class FourDigitYearConverter: regex = '[0-9]{4}' def to_python(self, value): return int(value) def to_url(self, value): return '%04d' % value 佔四位,不夠用0填滿,超了則就按超了的位數來! register_converter(FourDigitYearConverter, 'yyyy') urlpatterns = [ path('articles/2003/', views.special_case_2003), path('articles/<yyyy:year>/', views.year_archive), ... ]
視圖層
diango視圖函數必須會返回一個HttpResponse對象
先後端分離
名字的意思:就是前端一我的幹,後端一我的幹,那麼這個數據傳輸就要用到json來傳輸。
前端是轉自定義對象
前端的json.stringify() 等於後端的json.dumps()
json.parse()等於後端的json.loads()
後端只負責生產接口,前端經過這個接口與獲取一個大字典,
後端只須要寫一個接口文檔,裏面描述字典的詳細信息以及參數的傳遞
JsonResponse這個模塊
rom django.http import JsonResponse def index(request): data = {'name':'jason好帥哦 我好喜歡','password':123} l = [1,2,3,4,5,6,7,8] # res = json.dumps(data,ensure_ascii=False) # return HttpResponse(res) # return JsonResponse(data,json_dumps_params={'ensure_ascii':False}) return JsonResponse(l,safe=False) # 若是返回的不是字典 只須要修改safe參數爲false便可
上傳文件
form表單上傳文件需注意的
1.將enctype默認的編碼格式urlencode改爲formdata
2.將form表單默認的get請求,改爲post請求。
目前還須要考慮的是 提交post請求須要將配置文件中的csrf中間件註釋
若是form表單上傳文件 後端須要在request.FILES獲取文件數據 而再也不是POST裏面
request.method request.GET request.POST request.FILES request.path # 只回去url後綴 不獲取?後面的參數 request.get_full_path() # 後綴和參數所有獲取request.body 獲取二進制數據RBAC基於角色的權限管理path和get_full_path就是給權限的管理,權限等於url,判斷用戶輸入的url符合其能夠訪問的url