在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ Python/ 編寫(xiě)你的第一個(gè) Django 程序 第1部分
點(diǎn)擊劫持保護(hù)
安全問(wèn)題歸檔
Model 類(lèi)參考
將遺留數(shù)據(jù)庫(kù)整合到Django
關(guān)聯(lián)對(duì)象參考
內(nèi)建基于類(lèi)的視圖的API
聚合
Django 中的用戶(hù)認(rèn)證
django.contrib.humanize
Django管理文檔生成器
分頁(yè)
使用Django輸出CSV
加密簽名
文件儲(chǔ)存API
安全
Django中的測(cè)試
國(guó)際化和本地化
為Django編寫(xiě)首個(gè)補(bǔ)丁
條件表達(dá)式
日志
模型元選項(xiàng)
部署靜態(tài)文件
執(zhí)行查詢(xún)
使用Django認(rèn)證系統(tǒng)
基于類(lèi)的視圖
中間件
編寫(xiě)自定義的django-admin命令
Django 的設(shè)置
格式本地化
數(shù)據(jù)庫(kù)訪問(wèn)優(yōu)化
錯(cuò)誤報(bào)告
基于類(lèi)的內(nèi)建通用視圖
編寫(xiě)自定義存儲(chǔ)系統(tǒng)
編寫(xiě)你的第一個(gè) Django 程序 第3部分
編寫(xiě)數(shù)據(jù)庫(kù)遷移
使用表單
編寫(xiě)你的第一個(gè) Django 程序 第2部分
編寫(xiě)你的第一個(gè) Django 程序 第1部分
如何使用會(huì)話(huà)
系統(tǒng)檢查框架
新手入門(mén)
信號(hào)
編寫(xiě)視圖
如何使用WSGI 部署
編寫(xiě)你的第一個(gè)Django應(yīng)用,第6部分
常見(jiàn)的網(wǎng)站應(yīng)用工具
Widgets
內(nèi)建的視圖
模型實(shí)例參考
視圖層
Django中的密碼管理
高級(jí)教程:如何編寫(xiě)可重用的應(yīng)用
國(guó)際化和本地化
"本地特色"附加功能
TemplateResponse 和 SimpleTemplateResponse
模式編輯器
文件上傳
快速安裝指南
部署 Django
表單 API
表單素材 ( <code>Media</code> 類(lèi))
管理文件
其它核心功能
查找 API 參考
表單
Admin
數(shù)據(jù)庫(kù)函數(shù)
自定義查找
使用基于類(lèi)的視圖處理表單
管理操作
開(kāi)發(fā)過(guò)程
編寫(xiě)你的第一個(gè)Django應(yīng)用,第5部分
進(jìn)行原始的sql查詢(xún)
模型層
多數(shù)據(jù)庫(kù)
編寫(xiě)你的第一個(gè) Django 程序 第4部分
Django安全
Django 初探
Django異常
重定向應(yīng)用
按需內(nèi)容處理
管理器
視圖裝飾器
驗(yàn)證器
使用Django輸出PDF
File對(duì)象
Django 的快捷函數(shù)
基于類(lèi)的通用視圖 —— 索引
為模型提供初始數(shù)據(jù)
模板層
URL調(diào)度器
中間件
模型

編寫(xiě)你的第一個(gè) Django 程序 第1部分

讓我們通過(guò)例子來(lái)學(xué)習(xí)。

在本教程中,我們將引導(dǎo)您創(chuàng)建一個(gè)基本的投票應(yīng)用。

它將包含兩部分:

  • 一個(gè)公共網(wǎng)站,可讓人們查看投票的結(jié)果和讓他們進(jìn)行投票。
  • 一個(gè)管理網(wǎng)站,可讓你添加、修改和刪除投票項(xiàng)目。

我們假設(shè)你已經(jīng) 安裝了 Django 。你可以運(yùn)行以下命令來(lái)驗(yàn)證是否已經(jīng)安裝了 Django 和運(yùn)行著的版本號(hào):

python -c "import django; print(django.get_version())"

你應(yīng)該看到你安裝的 Django 版本或一個(gè)提示你 “No module named django” 的錯(cuò)誤。此外,還應(yīng)該檢查下你的版本與本教程的版本是否一致。 若不一致,你可以參考 Django 版本對(duì)應(yīng)的教程或者更新 Django 到最新版本。

請(qǐng)參考 如何安裝 Django 中的意見(jiàn)先刪除舊版本的 Django 再安裝一個(gè)新的。

在哪里可以獲得幫助:

如果您在學(xué)習(xí)本教程中遇到問(wèn)題,請(qǐng)?jiān)?django-users 上發(fā)貼或者在 #django on irc.freenode.net 上與其他可能會(huì)幫助您的 Django 用戶(hù)交流。

創(chuàng)建一個(gè)項(xiàng)目

如果這是你第一次使用 Django ,那么你必須進(jìn)行一些初始設(shè)置。也就是通過(guò)自動(dòng)生成代碼來(lái)建立一個(gè) Django 項(xiàng)目 project – 一個(gè) Django 項(xiàng)目的設(shè)置集,包含了數(shù)據(jù)庫(kù)配置、 Django 詳細(xì)選項(xiàng)設(shè)置和應(yīng)用特性配置。

在命令行中,使用 cd 命令進(jìn)入你想存儲(chǔ)代碼所在的目錄,然后運(yùn)行以下命令:

django-admin.py startproject mysite

這將在當(dāng)前目錄創(chuàng)建一個(gè) mysite 目錄。如果失敗了,請(qǐng)查看 Problems running django-admin.py.

Note

你需要避免使用 python 保留字或 Django 組件名作為項(xiàng)目的名稱(chēng)。尤其是你應(yīng)該避免使用的命名如: django (與 Django 本身會(huì)沖突) 或者 test (與 Python 內(nèi)置的包名會(huì)沖突).

這段代碼應(yīng)該放在哪里?

如果你有一般 PHP 的編程背景(未使用流行的框架),可能會(huì)將你的代碼放在 Web 服務(wù)器的文檔根目錄下(例如:/var/www)。而在 Django 中,你不必這么做。將任何 Python 代碼放在你的 Web 服務(wù)器文檔根目錄不會(huì)是一個(gè)好主意,因?yàn)檫@可能會(huì)增加人們通過(guò) Web 方式查看到你的代碼的風(fēng)險(xiǎn)。這不利于安全。

將你的代碼放在你的文檔根目錄 以外 的某些目錄, 例如 /home/mycode 。

讓我們來(lái)看看 startproject 都創(chuàng)建了些什么:

mysite/
    manage.py
    mysite/
        __init__.py
        settings.py
        urls.py
        wsgi.py

和你看到的不一樣?

默認(rèn)的項(xiàng)目布局最近剛剛改變過(guò)。如果你看到的是一個(gè)“扁平”結(jié)構(gòu)的目錄布局(沒(méi)有內(nèi)層 mysite/ 目錄),你很可能正在使用一個(gè)和本教程版本不一致的 Django 版本。你需要切換到對(duì)應(yīng)的舊版教程或者使用較新的 Django 版本。

這些文件是:

  • 外層 mysite/ 目錄只是你項(xiàng)目的一個(gè)容器。對(duì)于 Django 來(lái)說(shuō)該目錄名并不重要; 你可以重命名為你喜歡的。
  • manage.py: 一個(gè)實(shí)用的命令行工具,可讓你以各種方式與該 Django 項(xiàng)目進(jìn)行交互。 你可以在 django-admin.py and manage.py 中查看關(guān)于 manage.py 所有的細(xì)節(jié)。
  • 內(nèi)層 mysite/ 目錄是你項(xiàng)目中的實(shí)際 Python 包。該目錄名就是 Python 包名,通過(guò)它你可以導(dǎo)入它里面的任何東西。 (e.g. import mysite.settings).
  • mysite/init.py: 一個(gè)空文件,告訴 Python 該目錄是一個(gè) Python 包。(如果你是 Python 新手,請(qǐng)查看官方文檔了解 關(guān)于包的更多內(nèi)容 。)
  • mysite/settings.py: 該 Django 項(xiàng)目的設(shè)置/配置。請(qǐng)查看 Django settings 將會(huì)告訴你如何設(shè)置。
  • mysite/urls.py: 該 Django 項(xiàng)目的 URL 聲明; 一份由 Django 驅(qū)動(dòng)的網(wǎng)站“目錄”。請(qǐng)查看 URL dispatcher 可以獲取更多有關(guān) URL 的信息。
  • mysite/wsgi.py: 一個(gè) WSGI 兼容的 Web 服務(wù)器的入口,以便運(yùn)行你的項(xiàng)目。請(qǐng)查看 How to deploy with WSGI 獲取更多細(xì)節(jié)。

開(kāi)發(fā)用服務(wù)器

讓我們來(lái)驗(yàn)證是否工作。從外層 mysite 目錄切換進(jìn)去,若準(zhǔn)備好了就運(yùn)行命令 python manage.py runserver。你將會(huì)看到命令行輸出如下內(nèi)容:

Performing system checks...

0 errors found
May 13, 2015 - 15:50:53
Django version 1.8, using settings 'mysite.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.

你已經(jīng)啟動(dòng)了 Django 開(kāi)發(fā)服務(wù)器,一個(gè)純粹的由 Python 編寫(xiě)的輕量級(jí) Web 服務(wù)器。我們?cè)?Django 內(nèi)包含了這個(gè)服務(wù)器,這樣你就可以迅速開(kāi)發(fā)了,在產(chǎn)品投入使用之前不必去配置一臺(tái)生產(chǎn)環(huán)境下的服務(wù)器 – 例如 Apache 。

現(xiàn)在是一個(gè)很好的提示時(shí)機(jī):不要 在任何類(lèi)似生產(chǎn)環(huán)境中使用此服務(wù)器。它僅適用于開(kāi)發(fā)環(huán)境。(我們提供的是 Web 框架的業(yè)務(wù),而不是 Web 服務(wù)器。)

現(xiàn)在服務(wù)器正在運(yùn)行中,請(qǐng)?jiān)谀愕?Web 瀏覽器中訪問(wèn) http://127.0.0.1:8000/ 。 你會(huì)看到一個(gè)令人愉悅的,柔和的淡藍(lán)色 “Welcome to Django” 頁(yè)面。它工作正常!

更改端口號(hào)

默認(rèn)情況下,runserver 命令啟動(dòng)的開(kāi)發(fā)服務(wù)器只監(jiān)聽(tīng)本地 IP 的 8000 端口。

如果你想改變服務(wù)器的端口,把它作為一個(gè)命令行參數(shù)傳遞即可。例如以下命令啟動(dòng)的服務(wù)器將監(jiān)聽(tīng) 8080 端口:

python manage.py runserver 8080

如果你想改變服務(wù)器 IP ,把它和端口號(hào)一起傳遞即可。因此,要監(jiān)聽(tīng)所有公共 IP 地址(如果你想在其他電腦上炫耀你的工作),請(qǐng)使用:

python manage.py runserver 0.0.0.0:8000

有關(guān)開(kāi)發(fā)服務(wù)器的完整文檔可以在 runserver 內(nèi)參考。

數(shù)據(jù)庫(kù)設(shè)置

現(xiàn)在,編輯 mysite/settings.py 。 這是一個(gè)普通的 Python 模塊,包含了代表 Django 設(shè)置的模塊級(jí)變量。 更改 DATABASES 中 'default' 下的以下鍵的值,以匹配您的數(shù)據(jù)庫(kù)連接設(shè)置。

  • ENGINE – 從 'django.db.backends.postgresql_psycopg2', 'django.db.backends.mysql', 'django.db.backends.sqlite3', 'django.db.backends.oracle' 中選一個(gè), 至于其他請(qǐng)查看 also available.
  • NAME – 你的數(shù)據(jù)庫(kù)名。如果你使用 SQLite,該數(shù)據(jù)庫(kù)將是你計(jì)算機(jī)上的一個(gè)文件;在這種情況下,NAME 將是一個(gè)完整的絕對(duì)路徑,而且還包含該文件的名稱(chēng)。如果該文件不存在,它會(huì)在第一次同步數(shù)據(jù)庫(kù)時(shí)自動(dòng)創(chuàng)建(見(jiàn)下文)。

當(dāng)指定路徑時(shí),總是使用正斜杠,即使是在 Windows 下(例如:C:/homes/user/mysite/sqlite3.db) 。

  • USER – 你的數(shù)據(jù)庫(kù)用戶(hù)名 ( SQLite 下不需要) 。
  • PASSWORD – 你的數(shù)據(jù)庫(kù)密碼 ( SQLite 下不需要) 。
  • HOST – 你的數(shù)據(jù)庫(kù)主機(jī)地址。如果和你的數(shù)據(jù)庫(kù)服務(wù)器是同一臺(tái)物理機(jī)器,請(qǐng)將此處保留為空 (或者設(shè)置為 127.0.0.1) ( SQLite 下不需要) 。查看 HOST 了解詳細(xì)信息。

如果你是新建數(shù)據(jù)庫(kù),我們建議只使用 SQLite ,將 ENGINE 改為 'django.db.backends.sqlite3' 并且將 NAME 設(shè)置為你想存放數(shù)據(jù)庫(kù)的地方。 SQLite 是內(nèi)置在 Python 中的,因此你不需要安裝任何東西來(lái)支持你的數(shù)據(jù)庫(kù)。

Note

如果你使用 PostgreSQL 或者 MySQL,確保你已經(jīng)創(chuàng)建了一個(gè)數(shù)據(jù)庫(kù)。還是通過(guò)你的數(shù)據(jù)庫(kù)交互接口中的 “CREATE DATABASE database_name;” 命令做到這一點(diǎn)的。 如果你使用 SQLite ,你不需要事先創(chuàng)建任何東西 - 在需要的時(shí)候,將會(huì)自動(dòng)創(chuàng)建數(shù)據(jù)庫(kù)文件。 當(dāng)你編輯 settings.py 時(shí),將 TIME_ZONE 修改為你所在的時(shí)區(qū)。默認(rèn)值是美國(guó)中央時(shí)區(qū)(芝加哥)。

同時(shí),注意文件底部的 INSTALLED_APPS 設(shè)置。它保存了當(dāng)前 Django 實(shí)例已激活的所有 Django 應(yīng)用。每個(gè)應(yīng)用可以被多個(gè)項(xiàng)目使用,而且你可以打包和分發(fā)給其他人在他們的項(xiàng)目中使用。

默認(rèn)情況下,INSTALLED_APPS 包含以下應(yīng)用,這些都是由 Django 提供的:

  • django.contrib.auth – 身份驗(yàn)證系統(tǒng)。
  • django.contrib.contenttypes – 內(nèi)容類(lèi)型框架。
  • django.contrib.sessions – session 框架。
  • django.contrib.sites – 網(wǎng)站管理框架。
  • django.contrib.messages – 消息框架。
  • django.contrib.staticfiles – 靜態(tài)文件管理框架。

這些應(yīng)用在一般情況下是默認(rèn)包含的。

所有這些應(yīng)用中每個(gè)應(yīng)用至少使用一個(gè)數(shù)據(jù)庫(kù)表,所以在使用它們之前我們需要?jiǎng)?chuàng)建數(shù)據(jù)庫(kù)中的表。要做到這一點(diǎn),請(qǐng)運(yùn)行以下命令:

python manage.py syncdb

syncdb 命令參照 INSTALLED_APPS 設(shè)置,并在你的 settings.py 文件所配置的數(shù)據(jù)庫(kù)中創(chuàng)建必要的數(shù)據(jù)庫(kù)表。每創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)表你都會(huì)看到一條消息,接著你會(huì)看到一個(gè)提示詢(xún)問(wèn)你是否想要在身份驗(yàn)證系統(tǒng)內(nèi)創(chuàng)建個(gè)超級(jí)用戶(hù)。按提示輸入后結(jié)束。

如果你感興趣,可以在你的數(shù)據(jù)庫(kù)命令行下輸入:dt (PostgreSQL), SHOW TABLES; (MySQL), 或 .schema (SQLite) 來(lái)列出 Django 所創(chuàng)建的表。

極簡(jiǎn)主義者

就像我們上面所說(shuō)的,一般情況下以上應(yīng)用都默認(rèn)包含在內(nèi),但不是每個(gè)人都需要它們。如果不需要某些或全部應(yīng)用,在運(yùn)行 syncdb 命令前可從 INSTALLED_APPS 內(nèi)隨意注釋或刪除相應(yīng)的行。syncdb 命令只會(huì)為 INSTALLED_APPS 內(nèi)的應(yīng)用創(chuàng)建表。

創(chuàng)建模型

現(xiàn)在你的項(xiàng)目開(kāi)發(fā)環(huán)境建立好了, 你可以開(kāi)工了。

你通過(guò) Djaong 編寫(xiě)的每個(gè)應(yīng)用都是由 Python 包組成的,這些包存放在你的 Python path 中并且遵循一定的命名規(guī)范。 Django 提供了個(gè)實(shí)用工具可以自動(dòng)生成一個(gè)應(yīng)用的基本目錄架構(gòu),因此你可以專(zhuān)注于編寫(xiě)代碼而不是去創(chuàng)建目錄。

項(xiàng)目 ( Projects ) vs. 應(yīng)用 ( apps )

項(xiàng)目與應(yīng)用之間有什么不同之處?應(yīng)用是一個(gè)提供功能的 Web 應(yīng)用 – 例如:一個(gè)博客系統(tǒng)、一個(gè)公共記錄的數(shù)據(jù)庫(kù)或者一個(gè)簡(jiǎn)單的投票系統(tǒng)。 項(xiàng)目是針對(duì)一個(gè)特定的 Web 網(wǎng)站相關(guān)的配置和其應(yīng)用的組合。一個(gè)項(xiàng)目可以包含多個(gè)應(yīng)用。一個(gè)應(yīng)用可以在多個(gè)項(xiàng)目中使用。

你的應(yīng)用可以存放在 Python path 中的任何位置。在本教材中,我們將通過(guò)你的 manage.py 文件創(chuàng)建我們的投票應(yīng)用,以便它可以作為頂層模塊導(dǎo)入,而不是作為 mysite 的子模塊。

要?jiǎng)?chuàng)建你的應(yīng)用,請(qǐng)確認(rèn)與 manage.py 文件在同一的目錄下并輸入以下命令:

python manage.py startapp polls

這將創(chuàng)建一個(gè) polls 目錄,其展開(kāi)的樣子如下所示::

polls/
    __init__.py
    models.py
    tests.py
    views.py

此目錄結(jié)構(gòu)就是投票應(yīng)用。

在 Django 中編寫(xiě)一個(gè)有數(shù)據(jù)庫(kù)支持的 Web 應(yīng)用的第一步就是定義你的模型 – 從本質(zhì)上講就是數(shù)據(jù)庫(kù)設(shè)計(jì)及其附加的元數(shù)據(jù)。

哲理

模型是有關(guān)你數(shù)據(jù)的唯一且明確的數(shù)據(jù)源。它包含了你所要存儲(chǔ)的數(shù)據(jù)的基本字段和行為。 Django 遵循 DRY 原則 。目標(biāo)是為了只在一個(gè)地方定義你的數(shù)據(jù)模型就可從中自動(dòng)獲取數(shù)據(jù)。

在這簡(jiǎn)單的投票應(yīng)用中,我們將創(chuàng)建兩個(gè)模型: Poll 和 Choice。Poll 有問(wèn)題和發(fā)布日期兩個(gè)字段。Choice 有兩個(gè)字段: 選項(xiàng) ( choice ) 的文本內(nèi)容和投票數(shù)。每一個(gè) Choice 都與一個(gè) Poll 關(guān)聯(lián)。

這些概念都由簡(jiǎn)單的 Python 類(lèi)來(lái)表現(xiàn)。編輯 polls/models.py 文件后如下所示:

from django.db import models

class Poll(models.Model):
    question = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published')

class Choice(models.Model):
    poll = models.ForeignKey(Poll)
    choice_text = models.CharField(max_length=200)
    votes = models.IntegerField(default=0)

代碼很簡(jiǎn)單。每個(gè)模型都由繼承自 django.db.models.Model 子類(lèi)的類(lèi)來(lái)描述。 每個(gè)模型都有一些類(lèi)變量,每一個(gè)類(lèi)變量都代表了一個(gè)數(shù)據(jù)庫(kù)字段。

每個(gè)字段由一個(gè) Field 的實(shí)例來(lái)表現(xiàn) – 比如 CharField 表示字符類(lèi)型的字段和 DateTimeField 表示日期時(shí)間型的字段。這會(huì)告訴 Django 每個(gè)字段都保存了什么類(lèi)型的數(shù)據(jù)。

每一個(gè) Field 實(shí)例的名字就是字段的名字(如: question 或者 pub_date ),其格式屬于親和機(jī)器式的。在你的 Python 的代碼中會(huì)使用這個(gè)值,而你的數(shù)據(jù)庫(kù)會(huì)將這個(gè)值作為表的列名。

你可以在初始化 Field 實(shí)例時(shí)使用第一個(gè)位置的可選參數(shù)來(lái)指定人類(lèi)可讀的名字。這在Django的內(nèi)省部分中被使用到了,而且兼作文檔的一部分來(lái)增強(qiáng)代碼的可讀性。若字段未提供該參數(shù),Django 將使用符合機(jī)器習(xí)慣的名字。在本例中,我們僅定義了一個(gè)符合人類(lèi)習(xí)慣的字段名 Poll.pub_date 。對(duì)于模型中的其他字段,機(jī)器名稱(chēng)就已經(jīng)足夠替代人類(lèi)名稱(chēng)了。

一些 Field 實(shí)例是需要參數(shù)的。 例如 CharField 需要你指定 ~django.db.models.CharField.max_length。這不僅適用于數(shù)據(jù)庫(kù)結(jié)構(gòu),以后我們還會(huì)看到也用于數(shù)據(jù)驗(yàn)證中。

一個(gè) Field 實(shí)例可以有不同的可選參數(shù); 在本例中,我們將 votes 的 default 的值設(shè)為 0 。

最后,注意我們使用了 ForeignKey 定義了一個(gè)關(guān)聯(lián)。它告訴 Django 每一個(gè)Choice 關(guān)聯(lián)一個(gè) Poll 。 Django 支持常見(jiàn)數(shù)據(jù)庫(kù)的所有關(guān)聯(lián):多對(duì)一( many-to-ones ),多對(duì)多( many-to-manys ) 和 一對(duì)一 ( one-to-ones )。

激活模型

剛才那點(diǎn)模型代碼提供給 Django 大量信息。有了這些 Django 就可以做:

為該應(yīng)用創(chuàng)建對(duì)應(yīng)的數(shù)據(jù)庫(kù)架構(gòu) (CREATE TABLE statements) 。 為 Poll 和 Choice 對(duì)象創(chuàng)建 Python 訪問(wèn)數(shù)據(jù)庫(kù)的 API 。 但首先,我們需要告訴我們的項(xiàng)目已經(jīng)安裝了 polls 應(yīng)用。

哲理

Django 應(yīng)用是“可插拔的”:你可以在多個(gè)項(xiàng)目使用一個(gè)應(yīng)用,你還可以分發(fā)應(yīng)用,因?yàn)樗鼈儧](méi)有被捆綁到一個(gè)給定的 Django 安裝環(huán)境中。

再次編輯 settings.py 文件,在 INSTALLED_APPS 設(shè)置中加入 'polls' 字符。因此結(jié)果如下所示:

INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    # Uncomment the next line to enable the admin:
    # 'django.contrib.admin',
    # Uncomment the next line to enable admin documentation:
    # 'django.contrib.admindocs',
    'polls',
)

現(xiàn)在 Django 已經(jīng)知道包含了 polls 應(yīng)用。讓我們運(yùn)行如下命令:

python manage.py sql polls

你將看到類(lèi)似如下所示內(nèi)容 ( 有關(guān)投票應(yīng)用的 CREATE TABLE SQL 語(yǔ)句 ):

BEGIN;
CREATE TABLE "polls_poll" (
    "id" serial NOT NULL PRIMARY KEY,
    "question" varchar(200) NOT NULL,
    "pub_date" timestamp with time zone NOT NULL
);
CREATE TABLE "polls_choice" (
    "id" serial NOT NULL PRIMARY KEY,
    "poll_id" integer NOT NULL REFERENCES "polls_poll" ("id") DEFERRABLE INITIALLY DEFERRED,
    "choice_text" varchar(200) NOT NULL,
    "votes" integer NOT NULL
);
COMMIT;

請(qǐng)注意如下事項(xiàng):

  • 確切的輸出內(nèi)容將取決于您使用的數(shù)據(jù)庫(kù)會(huì)有所不同。
  • 表名是自動(dòng)生成的,通過(guò)組合應(yīng)用名 (polls) 和小寫(xiě)的模型名 – poll 和 choice 。 ( 你可以重寫(xiě)此行為。)
  • 主鍵 (IDs) 是自動(dòng)添加的。( 你也可以重寫(xiě)此行為。)
  • 按照慣例,Django 會(huì)在外鍵字段名上附加 "_id" 。 ( 是的,你仍然可以重寫(xiě)此行為。)
  • 外鍵關(guān)系由 REFERENCES 語(yǔ)句顯示聲明。
  • 生成 SQL 語(yǔ)句時(shí)針對(duì)你所使用的數(shù)據(jù)庫(kù),會(huì)為你自動(dòng)處理特定于數(shù)據(jù)庫(kù)的字段,例如 auto_increment (MySQL), serial (PostgreSQL), 或 or integer primary key (SQLite) 。 在引用字段名時(shí)也是如此 – 比如使用雙引號(hào)或單引號(hào)。 本教材的作者所使用的是 PostgreSQL,因此例子中輸出的是 PostgreSQL 的語(yǔ)法。
  • 這些 sql 命令其實(shí)并沒(méi)有在你的數(shù)據(jù)庫(kù)中運(yùn)行過(guò) - 它只是在屏幕上顯示出來(lái),以便讓你了解 Django 認(rèn)為什么樣的 SQL 是必須的。 如果你愿意,可以把 SQL 復(fù)制并粘帖到你的數(shù)據(jù)庫(kù)命令行下去執(zhí)行。 但是,我們很快就能看到, Django 提供了一個(gè)更簡(jiǎn)單的方法來(lái)執(zhí)行此 SQL 。

如果你感興趣,還可以運(yùn)行以下命令:

  • python manage.py validate – 檢查在構(gòu)建你的模型時(shí)是否有錯(cuò)誤。
  • python manage.py sqlcustom polls – 輸出為應(yīng)用定義的任何 custom SQL statements ( 例如表或約束的修改 ) 。
  • python manage.py sqlclear polls – 根據(jù)存在于你的數(shù)據(jù)庫(kù)中的表 (如果有的話(huà)) ,為應(yīng)用輸出必要的 DROP TABLE 。
  • python manage.py sqlindexes polls – 為應(yīng)用輸出 CREATE INDEX 語(yǔ)句。
  • python manage.py sqlall polls – 輸出所有 SQL 語(yǔ)句:sql, sqlcustom, 和 sqlindexes 。

看看這些輸出的命令可以幫助你理解框架底層實(shí)際上處理了些什么。

現(xiàn)在,再次運(yùn)行 syncdb 命令在你的數(shù)據(jù)庫(kù)中創(chuàng)建這些模型對(duì)應(yīng)的表:

python manage.py syncdb

syncdb 命令會(huì)給在 INSTALLED_APPS 中有但數(shù)據(jù)庫(kù)中沒(méi)有對(duì)應(yīng)表的應(yīng)用執(zhí)行 sqlall 操作。 該操作會(huì)為你上一次執(zhí)行 syncdb 命令以來(lái)在項(xiàng)目中添加的任何應(yīng)用創(chuàng)建對(duì)應(yīng)的表、初始化數(shù)據(jù)和創(chuàng)建索引。 syncdb 命令只要你喜歡就可以任意調(diào)用,并且它僅會(huì)創(chuàng)建不存在的表。

請(qǐng)閱讀 django-admin.py documentation 文檔了解 manage.py 工具更多的功能。

玩轉(zhuǎn) API

現(xiàn)在,我們進(jìn)入 Python 的交互式 shell 中玩弄 Django 提供給你的 API 。要調(diào)用 Python sell ,使用如下命令:

python manage.py shell

我們當(dāng)前使用的環(huán)境不同于簡(jiǎn)單的輸入 “python” 進(jìn)入的 shell 環(huán)境,因?yàn)?manage.py 設(shè)置了 DJANGO_SETTINGS_MODULE 環(huán)境變量,該變量給定了 Django 需要導(dǎo)入的 settings.py 文件所在路徑。

忽略 manage.py

若你不想使用 manage.py ,也是沒(méi)有問(wèn)題的。 僅需要將 DJANGO_SETTINGS_MODULE 環(huán)境變量值設(shè)為 mysite.settings 并在與 manage.py 文件所在同一目錄下運(yùn)行 python ( 或確保目錄在 Python path 下,那 import mysite 就可以了 )。

想了解更多的信息,請(qǐng)參考 django-admin.py 文檔 。

一旦你進(jìn)入了 shell,就可通過(guò) database API 來(lái)瀏覽數(shù)據(jù)::

>>> from polls.models import Poll, Choice   # Import the model classes we just wrote.

#  系統(tǒng)中還沒(méi)有 polls 。
>>> Poll.objects.all()
[]

# 創(chuàng)建一個(gè)新 Poll 。
# 在默認(rèn)配置文件中時(shí)區(qū)支持配置是啟用的,
# 因此 Django 希望為 pub_date 字段獲取一個(gè) datetime  with tzinfo 。使用了 timezone.now()
# 而不是 datetime.datetime.now() 以便獲取正確的值。
>>> from django.utils import timezone
>>> p = Poll(question="What's new?", pub_date=timezone.now())

# 保存對(duì)象到數(shù)據(jù)庫(kù)中。你必須顯示調(diào)用 save() 方法。
>>> p.save()

# 現(xiàn)在對(duì)象擁有了一個(gè)ID 。請(qǐng)注意這可能會(huì)顯示 "1L" 而不是 "1",取決于
# 你正在使用的數(shù)據(jù)庫(kù)。 這沒(méi)什么大不了的,它只是意味著你的數(shù)據(jù)庫(kù)后端
# 喜歡返回的整型數(shù)作為 Python 的長(zhǎng)整型對(duì)象而已。
>>> p.id
1

# 通過(guò) Python 屬性訪問(wèn)數(shù)據(jù)庫(kù)中的列。
>>> p.question
"What's new?"
>>> p.pub_date
datetime.datetime(2012, 2, 26, 13, 0, 0, 775217, tzinfo=<UTC>)

# 通過(guò)改為屬性值來(lái)改變值,然后調(diào)用 save() 方法。
>>> p.question = "What's up?"
>>> p.save()

# objects.all() 用以顯示數(shù)據(jù)庫(kù)中所有的 polls 。
>>> Poll.objects.all()
[<Poll: Poll object>]

請(qǐng)稍等。<Poll: Poll object> 這樣顯示對(duì)象絕對(duì)是無(wú)意義的。 讓我們編輯 polls 模型( 在 polls/models.py 文件中 ) 并且給 Poll 和 Choice 都添加一個(gè) unicode() 方法來(lái)修正此錯(cuò)誤:

class Poll(models.Model):
    # ...
    def __unicode__(self):
        return self.question

class Choice(models.Model):
    # ...
    def __unicode__(self):
        return self.choice_text

給你的模型添加 unicode() 方法是很重要的, 不僅是讓你在命令行下有明確提示,而且在 Django 自動(dòng)生成的管理界面中也會(huì)使用到對(duì)象的呈現(xiàn)。

為什么是 unicode() 而不是 str()?

如果你熟悉 Python,那么你可能會(huì)習(xí)慣在類(lèi)中添加 str() 方法而不是 unicode() 方法。 We use 我們?cè)谶@里使用 unicode() 是因?yàn)?Django 模型默認(rèn)處理的是 Unicode 格式。當(dāng)所有存儲(chǔ)在數(shù)據(jù)庫(kù)中的數(shù)據(jù)返回時(shí)都會(huì)轉(zhuǎn)換為 Unicode 的格式。

Django 模型有個(gè)默認(rèn)的 str() 方法 會(huì)去調(diào)用 unicode() 并將結(jié)果轉(zhuǎn)換為 UTF-8 編碼的字符串。這就意味著 unicode(p) 會(huì)返回一個(gè) Unicode 字符串,而 str(p) 會(huì)返回一個(gè)以 UTF-8 編碼的普通字符串。

如果這讓你感覺(jué)困惑,那么你只要記住在模型中添加 unicode() 方法。 運(yùn)氣好的話(huà),這些代碼會(huì)正常運(yùn)行。

請(qǐng)注意這些都是普通的 Python 方法。讓我們來(lái)添加個(gè)自定義方法,為了演示而已:

import datetime
from django.utils import timezone
# ...
class Poll(models.Model):
    # ...
    def was_published_recently(self):
        return self.pub_date >= timezone.now() - datetime.timedelta(days=1)

請(qǐng)注意,增加了 import datetime 和 from django.utils import timezone, 是為了分別引用 Python 的標(biāo)準(zhǔn)庫(kù) datetime 模塊和 Django 的 django.utils.timezone 中的 time-zone-related 實(shí)用工具 。如果你不熟悉在 Python 中處理時(shí)區(qū),你可以在 時(shí)區(qū)支持文檔 學(xué)到更多。

保存這些更改并且再次運(yùn)行 python manage.py shell 以開(kāi)啟一個(gè)新的 Python shell:

>>> from polls.models import Poll, Choice

# 確認(rèn)我們附加的  __unicode__() 正常運(yùn)行。
>>> Poll.objects.all()
[<Poll: What's up?>]

# Django 提供了一個(gè)豐富的數(shù)據(jù)庫(kù)查詢(xún) API ,
# 完全由關(guān)鍵字參數(shù)來(lái)驅(qū)動(dòng)。
>>> Poll.objects.filter(id=1)
[<Poll: What's up?>]
>>> Poll.objects.filter(question__startswith='What')
[<Poll: What's up?>]

# 獲取今年發(fā)起的投票。
>>> from django.utils import timezone
>>> current_year = timezone.now().year
>>> Poll.objects.get(pub_date__year=current_year)
<Poll: What's up?>

# 請(qǐng)求一個(gè)不存在的 ID ,這將引發(fā)一個(gè)異常。
>>> Poll.objects.get(id=2)
Traceback (most recent call last):
    ...
DoesNotExist: Poll matching query does not exist. Lookup parameters were {'id': 2}

# 根據(jù)主鍵查詢(xún)是常見(jiàn)的情況,因此 Django 提供了一個(gè)
# 主鍵精確查找的快捷方式。
# 以下代碼等同于 Poll.objects.get(id=1).
>>> Poll.objects.get(pk=1)
<Poll: What's up?>

# 確認(rèn)我們自定義方法正常運(yùn)行。
>>> p = Poll.objects.get(pk=1)
>>> p.was_published_recently()
True

# 給 Poll 設(shè)置一些 Choices 。通過(guò) create 方法調(diào)用構(gòu)造方法去創(chuàng)建一個(gè)新
# Choice 對(duì)象實(shí)例,執(zhí)行 INSERT 語(yǔ)句后添加該 choice 到
# 可用的 choices 集中并返回這個(gè)新建的 Choice 對(duì)象實(shí)例。 Django 創(chuàng)建了
# 一個(gè)保存外鍵關(guān)聯(lián)關(guān)系的集合 ( 例如 poll 的 choices) 以便可以通過(guò) API
# 去訪問(wèn)。
>>> p = Poll.objects.get(pk=1)

# 從關(guān)聯(lián)對(duì)象集中顯示所有 choices  -- 到目前為止還沒(méi)有。
>>> p.choice_set.all()
[]

# 創(chuàng)建三個(gè) choices 。
>>> p.choice_set.create(choice_text='Not much', votes=0)
<Choice: Not much>
>>> p.choice_set.create(choice_text='The sky', votes=0)
<Choice: The sky>
>>> c = p.choice_set.create(choice_text='Just hacking again', votes=0)

# Choice 對(duì)象擁有訪問(wèn)它們關(guān)聯(lián)的 Poll 對(duì)象的 API 。
>>> c.poll
<Poll: What's up?>

# 反之亦然: Poll 對(duì)象也可訪問(wèn) Choice 對(duì)象。
>>> p.choice_set.all()
[<Choice: Not much>, <Choice: The sky>, <Choice: Just hacking again>]
>>> p.choice_set.count()
3

# 只要你需要 API 會(huì)自動(dòng)連續(xù)關(guān)聯(lián)。
# 使用雙下劃線來(lái)隔離關(guān)聯(lián)。
# 只要你想要幾層關(guān)聯(lián)就可以有幾層關(guān)聯(lián),沒(méi)有限制。
# 尋找和今年發(fā)起的任何 poll 有關(guān)的所有 Choices
# ( 重用我們?cè)谏厦娼⒌?'current_year' 變量 )。
>>> Choice.objects.filter(poll__pub_date__year=current_year)
[<Choice: Not much>, <Choice: The sky>, <Choice: Just hacking again>]

# 讓我們使用 delete() 刪除 choices 中的一個(gè)。
>>> c = p.choice_set.filter(choice_text__startswith='Just hacking')
>>> c.delete()

欲了解更多有關(guān)模型關(guān)系的信息,請(qǐng)查看 訪問(wèn)關(guān)聯(lián)對(duì)象 。欲了解更多有關(guān)如何使用雙下劃線來(lái)通過(guò) API 執(zhí)行字段查詢(xún)的,請(qǐng)查看 字段查詢(xún) 。 如需完整的數(shù)據(jù)庫(kù) API 信息,請(qǐng)查看我們的 數(shù)據(jù)庫(kù) API 參考 。

當(dāng)你對(duì) API 有所了解后, 請(qǐng)查看 教程 第2部分 來(lái)學(xué)習(xí) Django 的自動(dòng)生成的管理網(wǎng)站是如何工作的。

譯者:Django 文檔協(xié)作翻譯小組,原文:Part 1: Models

本文以 CC BY-NC-SA 3.0 協(xié)議發(fā)布,轉(zhuǎn)載請(qǐng)保留作者署名和文章出處。

Django 文檔協(xié)作翻譯小組人手緊缺,有興趣的朋友可以加入我們,完全公益性質(zhì)。交流群:467338606。