[TOC]html
#先導入django中的models模塊 from django.db import models #先不考慮外鍵關係,建立基表 class Book(models.Model): titile = models.CharField(max_length = 32) #CharField字段必定要設置max_length #小數總共八位,小數點後佔兩位 price = models.DecimalField(max_digits=8,decimal_places=2) # to用來指代跟哪張表有關係 默認關聯的就是表的主鍵字段 publish_id = models.ForeignKey(to='Publish') ''' 一對多外鍵字段,同步到數據中心後,表字段會自動加_id後綴 若是手動加上_id,同步以後,仍是會自動加上另外一個_id ''' #書和做者是多對多的關係,外鍵字段能夠建在任意一方,通常建在查詢頻率高的一方 #django orm會自動建立書籍和做者的第三張關係表 #author該字段是一個虛擬字段,不能在表中展現出來,僅是起到一個高速orm,在建第三張表的關係起到做用 author = models.ManytoManyField(to='Author') class Publish(models.Model): title = models.CharField(max_length=32) email = models.EmailField() class Author(models.Model): name = models.CharField(max_length=32) email = models.EmailField() #一對一的表關係,外鍵字段建在任意一方均可以,通常建在查詢頻率高的一方 author_detail = models.OneToOneField(to='Author_detail') class Author_detail(models.Model): phone = models.BigIntegerField() addr = models.CharField(max_length=32)
url的第一個參數是一個正則表達式,只要是該正則表達式可以匹配到內容,就會馬上執行後面的視圖韓式,而再也不往下繼續匹配了前端
from django.conf.urls import url urlpatterns = [ url(正則表達式, views視圖函數,參數,別名), ]
#不加斜槓,會先匹配一次,若是匹配不上,Django可讓瀏覽器在url後自動加斜槓 #取消該功能 APPEND_SLASH = False # 該參數默認是True
#將分組內正則表達式匹配到的內容當作位置參數傳遞給視圖函數 url(r'^test/([0-9]{4})/', views.test) #當路由中有分組的正則表達式,在匹配到內容,執行視圖函數的時候,會將分組內正則表達式匹配的把內容當作位置參數傳給視圖函數
會將分組內的正則表達式匹配到的內容當作關鍵字參數傳遞給視圖函數python
#語法 url(r'^testadd/(?P<year>\d+)',views.testadd) # 當你的路由中有分組而且給分組起了別名 那麼在匹配內容的時候 # 會將分組內的正則表達式匹配到的內容當作關鍵字參數傳遞給視圖函數 testadd(request,year=分組內的正則表達式匹配到的內容)
有名分組和無名分組不能混合使用!mysql
根據別名,動態解析出一個結果,該結果能夠直接訪問對應的urlgit
#路由中沒有正則表達式 直接是寫死的 url(r'^home/', views.home,name='xxx'), # 給路由與視圖函數對應關係起別名 #前端反向解析 {% url 'xxx' %} #後端反向解析 from django.shortcuts import reverse url = reverse('xxx')
#無名分組的反向解析 在解析的時候 你須要手動指定正則匹配的內容是什麼 url(r'^home/(\d+)/', views.home,name='xxx'), # 給路由與視圖函數對應關係起別名 #前端反向解析 <p><a href="{% url 'xxx' 12 %}">111</a></p> <p><a href="{% url 'xxx' 1324 %}">111</a></p> <p><a href="{% url 'xxx' 14324 %}">111</a></p> <p><a href="{% url 'xxx' 1234 %}">111</a></p> #後端反向解析 url = reverse('xxx',args=(1,)) url1 = reverse('xxx',args=(3213,)) url2 = reverse('xxx',args=(2132131,)) # 手動傳入的參數 只須要知足可以被正則表達式匹配到便可
#有名分組的反向解析 在解析的時候 你須要手動指定正則匹配的內容是什麼 #有名分組的反向解析能夠跟無名分組同樣 #可是最最正規的寫法 url(r'^home/(?P<year>\d+)/', views.home,name='xxx'), # 給路由與視圖函數對應關係起別名 #前端 # 能夠直接用無名分組的狀況 <p><a href="{% url 'xxx' 12 %}">111</a></p> # 你也能夠規範寫法 <p><a href="{% url 'xxx' year=1232 %}">111</a></p> # 瞭解便可 #後端 # 能夠直接用無名分組的狀況 url = reverse('xxx',args=(1,)) # 你也能夠規範寫法 url = reverse('xxx',kwargs={'year':213123})
#以編輯功能爲例 url(r'^edit_user/(\d+)/',views.edit_user,name='edit') def edit_user(request,edit_id): # edit_id就是用戶想要編輯數據主鍵值 pass {% for user_obj in user_list %} <a href='/edit_user/{{user_obj.id}}/'>編輯</a> <a href='{% url 'edit' user_obj.id %}'>編輯</a> {% endfor %}
路由分發的前因:正則表達式
在django中全部的app均可以有本身獨立的urls.py templates staticsql
路由分發解決的就是項目的總路由匹配關係過多的狀況數據庫
使用路由分發,會將總路由再也不作匹配的活,而僅僅是作任務分發(請求來了以後,總路由不作對應關係)只詢問你要訪問哪一個app的功能 而後將請求轉發給對應的app去處理django
urlpatterns = [ url(r'^admin/', admin.site.urls), # url第一個參數是一個正則表達式 # 路由分發 url(r'^app01/',include(app01_urls)), # 路由分發須要注意的實現 就是總路由裏面不能以$結尾 url(r'^app02/',include(app02_urls)), ] # 子路由 from django.conf.urls import url from app01 import views urlpatterns = [ url('^reg/',views.reg) ] from django.conf.urls import url from app02 import views urlpatterns = [ url('^reg/',views.reg) ] #最省事的寫法(******) url(r'^app01/',include('app01.urls')), url(r'^app02/',include('app02.urls'))
當多個app中出現了起別名衝突的狀況,在作路由分發的時候,能夠給每個app建立一個名稱空間,而後在反向解析的時候,能夠選擇到底去哪一個名稱空間中查找別名後端
url(r'^app01/',include('app01.urls',namespace='app01')), url(r'^app02/',include('app02.urls',namespace='app02')) # 後端 print(reverse('app01:reg')) print(reverse('app02:reg')) # 前端 <a href="{% url 'app01:reg' %}"></a> <a href="{% url 'app02:reg' %}"></a> #使用名稱空間會開闢內存資源,佔空間 #其實上面的名稱空間知識點能夠徹底不用,你只須要保證起別名的時候 在整個django項目中不衝突便可 起別名的時候統一加上應用名前綴 urlpatterns = [ url(r'^reg/',views.reg,name='app02_reg') ] urlpatterns = [ url('^reg/',views.reg,name='app01_reg') ]
將一個動態網頁假裝成一個靜態網頁 以此來挺好搜索引擎SEO查詢頻率和蒐藏力度
所謂的搜索引擎其實就是一個也別巨大的爬蟲程序
url(r'^app01.html',include('app01.urls')),
給每個項目 裝備該項目所須要的模塊 不須要的模塊一律不裝
每建立一個虛擬環境就相似於你從新下載了一個純淨python解釋器 以後該項目用到上面 你就裝什麼(虛擬環境一臺機器上能夠有N多個)
urls.py中路由匹配的方法有區別 django2.X用的是path urlpatterns = [ path('admin/', admin.site.urls), ] django1.X用的是url urlpatterns = [ url(r'^reg.html',views.reg,name='app02_reg') ] # 區別 django2.X裏面path第一個參數不是正則也不支持正則 寫什麼就匹配什麼 # 雖然path不支持正則 感受也好用 django2.X還有一個re_path的方法 該方法就是你django1.X裏面url # 雖然path支持 可是它提供了五種轉換器 可以將匹配到的數據自動轉黃成對應的類型 # 除了有默認五種轉換器以外 還支持你自定義轉換器
foreign key
外鍵約束
1. 在建立表的時候,必須先建立被關聯表 2. 插入數據的時候,也必須先插入被關聯表的數據
如員工表和部門表之間就是一對多的關係,一般將關鍵字段稱之爲外鍵字段
外鍵建在多的一方
以圖書表和做者表舉例(換位思考)
1. 先站在圖書表:多本書可否是一個做者 2. 站在做者表中:多個做者可否共同編寫一本書
若是雙方都成立,那麼就是多對多
多對多關係的創建,必須手動建立第三張表,專門用來記錄兩種表之間的關係
一對一關係對較少,通常當表特別龐大時,能夠拆分表
好比客戶信息,與詳細信息表
外鍵字段能夠建在任意一方,通常建在查詢頻率高的一方
re模塊:去字符串找符合某種特色的字符串
import re s = 'abcdabc' #^ :以...開頭 res = re.findall('^ab',s) #$ :以...結尾 res = re.findall('bc$',s) # . :任意字符 res = re.findall('abc',s) # \d :數字 res = re.findall('\d',s) # \w :非空,數字字母下劃線 res = re.findall('\w',s) # \s :空,空格 res = re.findall('\s',s) # \D:非數字 res = re.findall('\D',s) # \W:空 res = re.findall('\W',s) #\S :非空 res = re.findall('\S',s) # + :前面的一個字符至少一個 print(re.findall('abc+',s)) # ? :尋找到?前面的一個字符 0-1 個 print(re.findall('abcdd?', s)) # * :前面的一個字符至少0個 print(re.findall('abcd*',s)) # [] :中括號內的均可以 print(re.findall('[abc]bc',s)) # [^] :中括號內的都不能夠 print(re.findall('[^abc]bc',s)) # | : 或 print(re.findall('abc|bbc',s)) # {2}:前面的字符 2個 print(re,findall('abc{2}',s)) # {1,2} :前面的字符 2 個 print(re,findall('abc{1,2}',s)) #貪婪模式 # .(任意字符) * (0-無窮個) print(re.findall('a.*g',s)) #非貪婪模式 # . (任意字符) * (0-無窮個) print(re,findall('a.*?g',s)) #bug # . (任意字符) * (0-無窮個) print(re.findall('.*?',s))