目錄
一、Django的MTV模式
二、Django基本指令
2.1 安裝Django
2.2 建立一個django項目
2.3 建立一個應用
2.4 啟動Django項目
2.5 同步更改資料庫表或字段
2.6 清空資料庫
2.7 建立超級管理者
2.8 導入導出資料
2.9 Django項目環境終端
2.10 資料庫指令行
2.11 檢視所有指令
三、 靜态檔案配置
3.1 配置方法一
3.2 配置方法二
四、第一個Django應用
4.1 建立一個名叫mysite的項目
4.2 建立一個名叫learn的應用
4.3 定義視圖函數views.py
4.4 定義網址與視圖函數對應關系
五、控制器urls.py
5.1 url()文法解析
5.2 無名分組
5.3 有名分組(named group)
5.4 引用每個應用自己的urls.py
5.5 URL name詳解
六、視圖函數views.py
6.1 一個簡單的視圖函數
6.2 HttpRequest對象
6.3 render函數
6.4 redirect函數
七、模闆(templates)
7.1 變量引用
7.2 模闆之過濾器
default
length
filesizeformat
date
slice
truncatechars
safe
7.3 模闆之标簽
for标簽
for … empty
if 标簽
with
csrf_token
八、Django-model基礎
8.1 ORM 映射關系
8.2 建立表
8.3 同步資料庫
8.4 插入資料
建立一個對象的4種方式
8.5 查詢資料
Django是目前最流行的Python Web架構。
一、Django的MTV模式
Django的MTV模式本質是各元件之間為了保持松耦合關系,MTV分别代表:
- Model(模型):負責業務對象與資料庫的對象(ORM)
- Template(模版):負責如何把頁面展示給使用者
- View(視圖):負責業務邏輯,并在适當的時候調用Model和Template。
注意:此外,Django還有一個url分發器,它的作用是将一個個URL的頁面請求分發給不同的view視圖函數處理,view再調用相應的Model和Template,然後傳回給使用者。

Paste_Image.png
Django處理使用者通路請求的流程
- 根據使用者通路的URL,通過urls.py中的urlpatterns對通路路徑進行正則比對,然後交給對應視圖函數(views.py中定義的函數)去處理;
- views.py視圖函數接收一下參數是request請求對象,對使用者請求做相應的邏輯處理。
- 邏輯處理過程中,如果需要存取資料,則要調用Model子產品去操作資料庫,然後将資料傳回給視圖函數;
- 視圖函數将取回的資料,通過
方法渲染到Template模版檔案(即html檔案)中,并傳回給使用者。render()
二、Django基本指令
2.1 安裝Django
pip3 install django
2.2 建立一個django項目
django-admin.py startproject mysite
//或
python manage.py startproject mysite
//mysite為自定義的項目名稱
執行上述指令,會在目前目錄下生成一個名叫mysite的工程,目錄結構如下:
- manage.py ----- Django項目裡面的工具,通過它可以調用django shell和資料庫等。
- settings.py ---- 包含了項目的預設設定,包括資料庫資訊,調試标志以及其他一些工作的變量。
- urls.py ----- 負責把URL模式映射到應用程式的視圖函數。
2.3 建立一個應用
進入到mysite項目目錄下
python manage.py startapp blog
//blog為自定義的應用程式名稱
目錄結構如下;
2.4 啟動Django項目
python manage.py runserver [IP:PORT]
//如果不加IP和端口,則會預設開啟本機的8000端口;
2.5 同步更改資料庫表或字段
Django 1.7.1及以上的版本用以下指令
# 1. 建立更改的檔案
python manage.py makemigrations
# 2. 将生成的py檔案應用到資料庫
python manage.py migrate
舊版本的Django 1.6及以下用
python manage.py syncdb
2.6 清空資料庫
python manage.py flush
此指令會詢問是 yes 還是 no, 選擇 yes 會把資料全部清空掉,隻留下空表。
2.7 建立超級管理者
python manage.py createsuperuser
#按照提示輸入使用者名和對應的密碼就好了,郵箱可以留白,使用者名和密碼必填
#修改使用者密碼可以用:
python manage.py changepassword username
2.8 導入導出資料
# 導出
python manage.py dumpdata appname > appname.json
# 導入
python manage.py loaddate appname.json
2.9 Django項目環境終端
python manage.py shell
這個指令和 直接運作 python 進入 shell 的差別是:你可以在這個 shell 裡面調用目前項目的 models.py 中的 API,對于操作資料,還有一些小測試非常友善。
2.10 資料庫指令行
python manage.py dbshell
Django 會自動進入在settings.py中設定的資料庫,如果是 MySQL 或 postgreSQL,會要求輸入資料庫使用者密碼。在這個終端可以執行資料庫的SQL語句。
2.11 檢視所有指令
python manage.py
檢視所有的指令,忘記子名稱的時候特别有用。
三、 靜态檔案配置
Django本身不處理靜态檔案,靜态檔案交由Web伺服器處理,以Nginx為例,簡單的處理邏輯如下:
概述:
URL請求 ---> 按nginx.conf中的location配置的規則先處理 --->
|---> 如果是靜态檔案,則直接由nginx處理;
|---> 如果不是,則交由Django處理,Django根據urls.py中的規則進行比對。
以上是部署到Web伺服器後的處理方式。為了便于開發,Django提供了在開發環境中對靜态檔案的處理機制,方法如下(static配置):
靜态檔案(static)主要指css、js、image這樣的檔案。
3.1 配置方法一
靜态檔案配置參考在settings.py中編輯如下:
STATIC_URL = '/static/' # 引用名
STATICFILES_DIRS = (os.path.join(BASE_DIR,"statics"),) #實際名 ,即實際檔案夾的名字
注意: 1、 django對引用名和實際名進行映射,引用靜态檔案時,隻能按照引用名找,不能按實際名去找。2、<script src="/statics/jquery-3.1.1.js"></script> //不正确,不能直接用statics去找,必須用STATIC_URL = '/static/' <script src="/static/jquery-3.1.1.js"></script> //正确
STATICFILES_DIRS = (("app01",os.path.join(BASE_DIR, "app01/statics")),) <script src="/static/app01/jquery.js"></script> //正确
3.2 配置方法二
- 首先確定
的settings.py
清單中包含INSTALLED_APPS
;django.contrib.staticfiles
- 在你的
檔案中,定義settings.py
,例如:STATIC_URL
STATIC_URL = '/static/'
- 在模版檔案中這樣引用:
{% load static %} //寫在檔案第一行
<img src="{% static "my_app/example.jpg" %}" alt="My image"/>
- 将您的靜态檔案存儲在應用程式中名為static的檔案夾中。 例如:my_app/static/my_app/example.jpg。
四、第一個Django應用
4.1 建立一個名叫mysite的項目
django-admin startproject mysite
4.2 建立一個名叫learn的應用
python manage.py startapp learn # learn 是一個app的名稱
把建立的app名稱加入settings.py中的INSTALL_APPS中;
修改mysite/mysite/settings.py
INSTALLED_APPS = (
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'learn',
)
注意:建立的 app 如果不加到 INSTALL_APPS 中的話, django 就不能自動找到app中的模闆檔案(app-name/templates/下的檔案)和靜态檔案(app-name/static/中的檔案)
4.3 定義視圖函數 views.py
views.py
視圖函數是對使用者的通路請求進行邏輯處理,然後再傳回給浏覽器
編輯
mysite/learn/views.py
:
from django.http import render,HttpResponse
def index(request):
return HttpResponse(u"歡迎光臨 !")
注意:定義了一個index()函數,第一個參數必須是request,與網頁發來的請求有關,request 變量裡面包含GET或POST的内容,使用者浏覽器,系統等資訊在裡面。
函數傳回一個HttpResponse 對象,是用來向網頁傳回内容的。
那麼如何讓網址和視圖函數關聯起來呢?
4.4 定義網址與視圖函數對應關系
也就是定義一個網址,應該用哪個視圖函數去處理并響應。
mysite/mysite/urls.py
from django.conf.urls import url
from django.contrib import admin
from learn import views as learn_views # new
urlpatterns = [
url(r'^$', learn_views.index), # new
url(r'^index/', learn_views.index), # new
url(r'^admin/', admin.site.urls),
]
以上修改并儲存後,運作項目,看一下效果!
$ python manage.py runserver
Performing system checks...
System check identified no issues (0 silenced).
You have unapplied migrations; your app may not work properly until they are applied.
Run 'python manage.py migrate' to apply them.
December 22, 2015 - 11:57:33
Django version 1.9, using settings 'mysite.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
打開浏覽器,通路http://127.0.0.1:8000/ 或
http://127.0.0.1:8000/index/會在頁面上看到 “歡迎光臨!”
五、控制器urls.py
5.1 url()文法解析
urlpatterns = [
url(正規表達式, views視圖函數,參數,别名),
]
參數說明:
1. 一個正規表達式字元串
2. 一個可調用對象,通常為一個視圖函數或一個指定視圖函數路徑的字元串
3. 可選的要傳遞給視圖函數的預設參數(字典形式),一般不用
4. 一個可選的name參數,是為視圖函數起的别名,在模闆檔案中引用時用到。
5.2 無名分組
如果URL中帶有需要傳給後端伺服器處理的值,就可以在
url()
中将比對此值的正則放在括号()中即可,然後django會自動将括号()中的正則比對到的值當作參數傳給後面的視圖函數。視圖函數在定義時,必須要定義接收參數的形參,否則會報錯。
urls.py
,添加如下配置
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^articles/2003/$', views.special_case_2003),
url(r'^articles/([0-9]{4})/$', views.year_archive),
url(r'^articles/([0-9]{4})/([0-9]{2})/$', views.month_archive),
url(r'^articles/([0-9]{4})/([0-9]{2})/([0-9]+)/$', views.article_detail),
]
- 通路 http://127.0.0.1:8000/articles/2012 ,會被上述代碼中第2條url()中的正則比對到,并且會将([0-9]{4})比對到的值2012當作參數傳給對應的視圖函數,是以會調用
,在views.py中定義函數year_archive()時,一定要多加一個形參用來接收url中傳遞的參數,例:views.year_archive(request,'2012')
def year_archive(request,number):
return HttpResponse(number)
- http://127.0.0.1:8000/articles/2012/12/ , 會被 上述代碼中第3條url()中的正則比對到,并且會将 ([0-9]{4}) 和 ([0-9]{2})比對到的值2012和12當作參數傳給對應的視圖函數,調用
,視圖函數定義應該是這樣:views.month_archive(request,'2012','12')
def month_archive(request,num1,num2):
return HttpResponse(num1,num2)
5.3 有名分組(named group)
有名分組的文法:
(?P<name>pattern)
其中name是自定義的組名稱,pattern是要比對的模式。
有名分組會将name當作Key,pattern比對到的值當作Value,以關鍵字傳參給視圖函數,定義視圖函數時,定義的形參,必須與name同名。
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^articles/2003/$', views.special_case_2003),
url(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive),
url(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.month_archive),
]
def year_archive(request,year):
return HttpResponse(year)
def month_archive(request,year,month):
return HttpResponse(year,month)
5.4 引用每個應用自己的urls.py
當一個網站有太多的url時,所有的url都通過全局urls.py去映射視圖函數,會顯得非常淩亂。這時将每個應用的url通過應用自己的urls.py去映射視圖函數,結構就會清晰很多。
建立 blog/urls.py
# 需要先引入include
from django.conf.urls import include, url
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^blog/', include('blog.urls')),
] # 将所有以blog開頭的URL交給blog應用下面的urls.py處理
5.5 URL name詳解
url()
中name參數詳解 六、視圖函數views.py
一個視圖函數,簡稱視圖,是一個簡單的Python 函數,它接受Web請求并且傳回Web響應。響應可以是一張網頁的HTML内容,一個重定向,一個404錯誤,一個XML文檔,或者一張圖檔. . . 是任何東西都可以。無論視圖本身包含什麼邏輯,都要傳回響應。代碼寫在哪裡也無所謂,隻要它在你的Python目錄下面。除此之外沒有更多的要求了——可以說“沒有什麼神奇的地方”。為了将代碼放在某處,約定是将視圖放置在項目或應用程式目錄中的名為views.py的檔案中。
6.1 一個簡單的視圖函數
下面是一個傳回目前日期和時間作為HTML文檔的視圖:
from django.http import HttpResponse
import datetime
def current_datetime(request):
now = datetime.datetime.now()
html = "<html><body>It is now %s.</body></html>" % now
return HttpResponse(html)
讓我們逐行閱讀上面的代碼:
- 首先,我們從 django.http子產品導入了HttpResponse類,以及Python的datetime庫。
- 接着,我們定義了current_datetime函數。它就是視圖函數。每個視圖函數都使用HttpRequest對象作為第一個參數,并且通常稱之為request。
- 注意,視圖函數的名稱并不重要;不需要用一個統一的命名方式來命名,以便讓Django識别它。我們将其命名為current_datetime,是因為這個名稱能夠精确地反映出它的功能。
- 這個視圖會傳回一個HttpResponse對象,其中包含生成的響應。每個視圖函數都負責傳回一個HttpResponse對象。
6.2 HttpRequest對象
視圖函數的第一個參數就是HttpRequest對象,通常定為request,這個對象中封裝了與請求相關的一些屬性和方法,如下:
屬性:
from django.shortcuts import render
def index(request):
request.path #請求頁面的全路徑,不包括域名
request.method #HTTP請求訪求,大寫的字元串,如GET/POST
request.GET #包含所有HTTP GET請求方法擷取的參數,字典
request.POST #包含所有HTTP POST請求方法擷取的參數,字典
request.COOKIES #包含所有cookies的标準python字典對象,keys和values都是字元串
request.FILES #包含所有上傳檔案的類字典對象,FILES中的每一個Key都是<input type="file" name="" />标簽中name屬性的值,FILES中的每一個value同時也是一個标準的python字典對象,包含下面三個keys:
//filename: 上傳檔案的檔案名,用字元串表示
//content_type: 上傳檔案的Content Type
//content: 上傳檔案的原始内容
request.user #是一個django.contrib.auth.models.User對象,代表目前登陸的使用者。如果通路使用者目前沒有登陸,user将被初始化為django.contrib.auth.models.AnonymousUser的執行個體。你可以通過user的is_authenticated()方法來辨識使用者是否登陸:if req.user.is_authenticated();隻有激活Django中的AuthenticationMiddleware時該屬性才可用
request.session #唯一可讀寫的屬性,代表目前會話的字典對象;自己有激活Django中的session支援時該屬性才可用。
方法:
def index(request):
request.get_full_path() #請求全路徑,包含參數
注意:當鍵值對的值有多個的時候,比如:type='checkbox'類型的input标簽、select标簽,就需要用如下方法:request.POST.getlist('hobby')
6.3 render函數
render()
函數的功能:将python中的變量,嵌入到模闆檔案(html檔案)中,将渲染後的html檔案傳回給使用者。
文法:
render(request,template_name[,context])
參數:
- request:請求對象
- template_name:要使用的模闆檔案名
- context:是一個字典,key将在模闆中被引用,value是目前視圖函數中的某一個變量。可以直接用
函數代替,locals()
會将目前函數中的所有變量提供給模闆使用,模闆在使用時,直接寫locals()
即可引用該變量。{{ 變量名 }}
示例:
from django.shortcuts import render
import datetime
#視圖函數
def index(request):
now = datetime.datetime.now()
return render(request,'index.html',{'current_time':now})
#也可以這樣:
#
在templates目錄中建立一個模闆檔案index.html,内容如下:
<h1>{{ current_time }}</h1>
這樣既可将視圖中的變量渲染到html檔案中。
使用
locals()
:
from django.shortcuts import render
import datetime
#視圖函數
def index(request):
now = datetime.datetime.now()
return render(request,'index.html',locals())
模闆檔案中就可以直接引用變量了:
<h1>{{ now }}</h1>
6.4 redirect函數
重定向到一個新頁面
#視圖函數
def addBook(request):
if request.method == 'POST':
...
此段代碼是向資料庫寫入前端頁面送出的資料
...
return redirect('/index/') #資料寫入完成後,重新回到首頁
return render(request,'addbook.html')
注意:預設情況下,傳回一個臨時重定向,如果需要永久重定向,則需要設定permanent參數為True,如下:
redirect()
def myView(req): return redirect('/index/',permanent=Ture)
也可以是一個完整的URL
def my_view(request):
...
return redirect('http://example.com/')
七、模闆(templates)
Django的模闆:HTML代碼 + 邏輯控制代碼
7.1 變量引用
在模闆中引用視圖函數中的變量,需要通過雙大括号将變量包括其中。
文法格式:
{{ 變量名 }}
views.py
def index(request):
import datetime
s="hello"
l=[111,222,333] # 清單
dic={"name":"yuan","age":18} # 字典
date = datetime.date(1993, 5, 2) # 日期對象
class Person(object):
def __init__(self,name):
self.name=name
person_yuan=Person("yuan") # 自定義類對象
person_egon=Person("egon")
person_alex=Person("alex")
person_list=[person_yuan,person_egon,person_alex]
return render(request,"index.html",{"l":l,"dic":dic,"date":date,"person_list":person_list})
template中的index.html内容如下:
<h4>清單:{{ l.0 }}</h4>
<h4>清單:{{ l.2 }}</h4>
<h4>字典:{{ dic.name }}</h4>
<h4>日期:{{ date.year }}</h4>
<h4>類對象清單:{{ person_list.0.name }}</h4>
urls.py内容如下:
from django.conf.urls import url
from django.contrib import admin
from app01 import views
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^index/', views.index),
]
運作項目:
python manage.py runserver 9000
浏覽器通路
http://127.0.0.1:9000/index/,會得到如下圖結果:
image.png
注意:句點符也可以用來引用對象的方法(無參數方法)。<h4>字典:{{ dic.name.upper }}</h4>
7.2 模闆之過濾器
{{obj|filter__name:param}}
default
如果一個變量是false或者為空,使用給定的預設值。否則,使用變量的值。例如:
{{ value|default:"nothing" }}
length
傳回值的長度。它對字元串和清單都起作用。例如:
{{ value|length }}
//如果 value 是 ['a', 'b', 'c', 'd'],那麼輸出是 4。
filesizeformat
将值格式化為一個 “人類可讀的” 檔案尺寸 (例如 '13 KB', '4.1 MB', '102 bytes', 等等)。例如:
{{ value|filesizeformat }}
//如果 value 是 123456789,輸出将會是 117.7 MB。
date
如果 value=datetime.datetime.now()
{{ value|date:"Y-m-d" }}
//輸出的日期格式為xxxx-xx-xx 年-月-日
slice
對字元串或清單進行切片,如果 value="hello world"
{{ value|slice:"2:-1" }}
//輸出 ‘llo worl’
truncatechars
如果字元串字元多于指定的字元數量,那麼會被截斷。截斷的字元串将以可翻譯的省略号序列(“...”)結尾。
參數:要截斷的字元數
例如:
{{ value|truncatechars:9 }}
truncatewords是截斷指定的單詞個數
safe
Django的模闆中會對HTML标簽和JS等文法标簽進行自動轉義,原因顯而易見,這樣是為了安全。但是有的時候我們可能不希望這些HTML元素被轉義,比如我們做一個内容管理系統,背景添加的文章中是經過修飾的,這些修飾可能是通過一個類似于FCKeditor編輯加注了HTML修飾符的文本,如果自動轉義的話顯示的就是保護HTML标簽的源檔案。為了在Django中關閉HTML的自動轉義有兩種方式,如果是一個單獨的變量我們可以通過過濾器“|safe”的方式告訴Django這段代碼是安全的不必轉義。比如:
value="<a href="">點選</a>"
{{ value|safe}}
//可以将value在頁面上渲染成一個a标簽,如果不用safe過濾器,則隻是顯示value值的字元串
7.3 模闆之标簽
标簽看起來像是這樣的: {% tag %}。标簽比變量更加複雜:一些在輸出中建立文本,一些通過循環或邏輯來控制流程,一些加載其後的變量将使用到的額外資訊到模版中。
一些标簽需要開始和結束标簽 (例如{% tag %} ...标簽 内容 ... {% endtag %})。
for标簽
周遊每一個元素
{% for person in person_list %}
<p>{{ person.name }}</p>
{% endfor %}
可以利用 {% for obj in list reversed %}
反向完成循環。
周遊一個字典:
{% for key,val in dic.items %}
<p>{{ key }}:{{ val }}</p>
{% endfor %}
注意:循環序号可以通過顯示.
{{ forloop }}
forloop.counter //顯示循環序号,從1開始 forloop.counter0 //顯示循環序号,從0開始 forloop.revcounter //反向顯示循環序号,從大到小,最後一位是1 forloop.revcounter0 //從大到小,最後一位是0 forloop.first //第一個是True,後面的都是False forloop.last //最後一個是True,前面的都是False
for ... empty
for 标簽帶有一個可選的
{% empty %}
從句,以便在給出的組是空的或者沒有被找到時,可以另做其它操作。
{% for person in person_list %}
<p>{{ person.name }}</p>
{% empty %}
<p>sorry,no person here</p>
{% endfor %}
if 标簽
{% if %}
會對一個變量求值,如果它的值是“True”(存在、不為空、且不是boolean類型的false值),對應的内容塊會輸出。
{% if num > 100 or num < 0 %}
<p>無效</p>
{% elif num > 80 and num < 100 %}
<p>優秀</p>
{% else %}
<p>湊活吧</p>
{% endif %}
with
使用一個簡單地名字緩存一個複雜的變量,當你需要使用一個“昂貴的”方法(比如通路資料庫)很多次的時候是非常有用的。
{% with total=business.employees.count %}
{{ total }} employee{{ total|pluralize }}
{% endwith %}
csrf_token
這個标簽用于跨站請求僞造保護,一般用在
<form>
表單的請求方法是POST時,将
{% csrf_token %}
放在
<form>
表單中
{% csrf_token %}
八、Django-model基礎
Django 模型是與資料庫相關的,與資料庫相關的代碼一般寫在 models.py 中,Django 支援 sqlite3, MySQL, PostgreSQL等資料庫,隻需要在settings.py中配置即可,不用更改models.py中的代碼,豐富的API極大的友善了使用。
8.1 ORM 映射關系
表名 -----------> 類名
字段 -----------> 屬性
表記錄 --------> 類執行個體化的對象
8.2 建立表
編輯app_name/models.py
from django.db import models
class Person(models.Model):
name = models.CharField(max_length=30)
age = models.IntegerField()
我們建立了一個Person類,繼承自models.Model, 一個人有姓名和年齡。
這裡用到了兩種Field,更多Field類型,
請參考此篇文檔在settings.py中添加LOGGING,可以檢視資料庫操作時對應的SQL語句:
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'console':{
'level':'DEBUG',
'class':'logging.StreamHandler',
},
},
'loggers': {
'django.db.backends': {
'handlers': ['console'],
'propagate': True,
'level':'DEBUG',
},
}
}
8.3 同步資料庫
# 先 cd 進入 manage.py 所在的那個檔案夾下,輸入下面的指令
# Django 1.7 及以上的版本需要用以下指令
python manage.py makemigrations
python manage.py migrate
指令執行,會看到下圖:
我們會看到,Django生成了一系列的表,也生成了我們建立的people_person這個表。
8.4 插入資料
也就是建立一個對象,每行表記錄就是一個對象
$ python manage.py shell
>>> from app_name.models import Person
>>> Person.objects.create(name="WeizhongTu", age=24)
<Person: Person object>
>>>
我們建立了一個使用者WeizhongTu 那麼如何從資料庫是查詢到它呢?
>>> Person.objects.get(name="WeizhongTu")
<Person: Person object>
>>>
我們用了一個 .objects.get() 方法查詢出來符合條件的對象,但是大家注意到了沒有,查詢結果中顯示<Person: Person object>,這裡并沒有顯示出與WeizhongTu的相關資訊,如果使用者多了就無法知道查詢出來的到底是誰,查詢結果是否正确,我們重新修改一下 models.py
from django.db import models
class Person(models.Model):
name = models.CharField(max_length=30)
age = models.IntegerField()
def __str__(self):
return self.name
按 CTRL + C 退出目前的 Python shell, 重複上面的操作,我們就可以看到:
>>>from app_name import Person Person.objects.get(name="WeizhongTu")
<Person: WeizhongTu>
>>>
建立一個對象的4種方式
第一種:
Person.objects.create(name=name,age=age)
第二種:
p = Person(name="WZ", age=23)
p.save()
第三種:
p = Person(name="TWZ")
p.age = 23
p.save()
第四種:
Person.objects.get_or_create(name="WZT", age=23)
這種方法是防止重複很好的方法,但是速度要相對慢些,傳回一個元組,第一個為Person對象,第二個為True或False, 建立時傳回的是True, 已經存在時傳回False.
8.5 查詢資料
也就是擷取表記錄(對象)
Person.objects.all()
Person.objects.all()[:10] 切片操作,擷取10個人,不支援負索引,切片可以節約記憶體
Person.objects.get(name=name)
#get是用來擷取一個對象的,如果需要擷取滿足條件的一些人,就要用到filter
Person.objects.filter(name="abc") # 等于Person.objects.filter(name__exact="abc") 名稱嚴格等于 "abc" 的人
Person.objects.filter(name__iexact="abc") # 名稱為 abc 但是不區分大小寫,可以找到 ABC, Abc, aBC,這些都符合條件
Person.objects.filter(name__contains="abc") # 名稱中包含 "abc"的人
Person.objects.filter(name__icontains="abc") #名稱中包含 "abc",且abc不區分大小寫
Person.objects.filter(name__regex="^abc") # 正規表達式查詢
Person.objects.filter(name__iregex="^abc") # 正規表達式不區分大小寫
#filter是找出滿足條件的,當然也有排除符合某條件的
Person.objects.exclude(name__contains="WZ") # 排除包含 WZ 的Person對象
Person.objects.filter(name__contains="abc").exclude(age=23) # 找出名稱含有abc, 但是排除年齡是23歲的