# 編寫你的第一個 Django 程序 第1部分 #
讓我們通過例子來學習。
在本教程中,我們將引導您創建一個基本的投票應用。
它將包含兩部分:
+ 一個公共網站,可讓人們查看投票的結果和讓他們進行投票。
+ 一個管理網站,可讓你添加、修改和刪除投票項目。
我們假設你已經 安裝了 Django 。你可以運行以下命令來驗證是否已經安裝了 Django 和運行著的版本號:
```
python -c "import django; print(django.get_version())"
```
你應該看到你安裝的 Django 版本或一個提示你 “No module named django” 的錯誤。此外,還應該檢查下你的版本與本教程的版本是否一致。 若不一致,你可以參考 Django 版本對應的教程或者更新 Django 到最新版本。
請參考 如何安裝 Django 中的意見先刪除舊版本的 Django 再安裝一個新的。
> 在哪里可以獲得幫助:
>
> 如果您在學習本教程中遇到問題,請在 django-users 上發貼或者在 #django on irc.freenode.net 上與其他可能會幫助您的 Django 用戶交流。
## 創建一個項目 ##
如果這是你第一次使用 Django ,那么你必須進行一些初始設置。也就是通過自動生成代碼來建立一個 Django 項目 project – 一個 Django 項目的設置集,包含了數據庫配置、 Django 詳細選項設置和應用特性配置。
在命令行中,使用 cd 命令進入你想存儲代碼所在的目錄,然后運行以下命令:
```
django-admin.py startproject mysite
```
這將在當前目錄創建一個 mysite 目錄。如果失敗了,請查看 Problems running django-admin.py.
> Note
>
> 你需要避免使用 python 保留字或 Django 組件名作為項目的名稱。尤其是你應該避免使用的命名如: django (與 Django 本身會沖突) 或者 test (與 Python 內置的包名會沖突).
> 這段代碼應該放在哪里?
>
> 如果你有一般 PHP 的編程背景(未使用流行的框架),可能會將你的代碼放在 Web 服務器的文檔根目錄下(例如:``/var/www``)。而在 Django 中,你不必這么做。將任何 Python 代碼放在你的 Web 服務器文檔根目錄不會是一個好主意,因為這可能會增加人們通過 Web 方式查看到你的代碼的風險。這不利于安全。
將你的代碼放在你的文檔根目錄 以外 的某些目錄, 例如 /home/mycode 。
讓我們來看看 startproject 都創建了些什么:
```
mysite/
manage.py
mysite/
__init__.py
settings.py
urls.py
wsgi.py
```
> 和你看到的不一樣?
>
> 默認的項目布局最近剛剛改變過。如果你看到的是一個“扁平”結構的目錄布局(沒有內層 mysite/ 目錄),你很可能正在使用一個和本教程版本不一致的 Django 版本。你需要切換到對應的舊版教程或者使用較新的 Django 版本。
這些文件是:
+ 外層 mysite/ 目錄只是你項目的一個容器。對于 Django 來說該目錄名并不重要; 你可以重命名為你喜歡的。
+ manage.py: 一個實用的命令行工具,可讓你以各種方式與該 Django 項目進行交互。 你可以在 django-admin.py and manage.py 中查看關于 manage.py 所有的細節。
+ 內層 mysite/ 目錄是你項目中的實際 Python 包。該目錄名就是 Python 包名,通過它你可以導入它里面的任何東西。 (e.g. import mysite.settings).
+ mysite/__init__.py: 一個空文件,告訴 Python 該目錄是一個 Python 包。(如果你是 Python 新手,請查看官方文檔了解 關于包的更多內容 。)
+ mysite/settings.py: 該 Django 項目的設置/配置。請查看 Django settings 將會告訴你如何設置。
+ mysite/urls.py: 該 Django 項目的 URL 聲明; 一份由 Django 驅動的網站“目錄”。請查看 URL dispatcher 可以獲取更多有關 URL 的信息。
+ mysite/wsgi.py: 一個 WSGI 兼容的 Web 服務器的入口,以便運行你的項目。請查看 How to deploy with WSGI 獲取更多細節。
## 開發用服務器 ##
讓我們來驗證是否工作。從外層 mysite 目錄切換進去,若準備好了就運行命令 ``python manage.py runserver``。你將會看到命令行輸出如下內容:
```
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.
```
你已經啟動了 Django 開發服務器,一個純粹的由 Python 編寫的輕量級 Web 服務器。我們在 Django 內包含了這個服務器,這樣你就可以迅速開發了,在產品投入使用之前不必去配置一臺生產環境下的服務器 – 例如 Apache 。
現在是一個很好的提示時機:**不要** 在任何類似生產環境中使用此服務器。它僅適用于開發環境。(我們提供的是 Web 框架的業務,而不是 Web 服務器。)
現在服務器正在運行中,請在你的 Web 瀏覽器中訪問 http://127.0.0.1:8000/ 。 你會看到一個令人愉悅的,柔和的淡藍色 “Welcome to Django” 頁面。它工作正常!
> 更改端口號
>
> 默認情況下,runserver 命令啟動的開發服務器只監聽本地 IP 的 8000 端口。
>
> 如果你想改變服務器的端口,把它作為一個命令行參數傳遞即可。例如以下命令啟動的服務器將監聽 8080 端口:
>
```
python manage.py runserver 8080
```
>
> 如果你想改變服務器 IP ,把它和端口號一起傳遞即可。因此,要監聽所有公共 IP 地址(如果你想在其他電腦上炫耀你的工作),請使用:
>
```
python manage.py runserver 0.0.0.0:8000
```
> 有關開發服務器的完整文檔可以在 runserver 內參考。
## 數據庫設置 ##
現在,編輯 mysite/settings.py 。 這是一個普通的 Python 模塊,包含了代表 Django 設置的模塊級變量。 更改 DATABASES 中 'default' 下的以下鍵的值,以匹配您的數據庫連接設置。
+ ENGINE – 從 'django.db.backends.postgresql_psycopg2', 'django.db.backends.mysql', 'django.db.backends.sqlite3', 'django.db.backends.oracle' 中選一個, 至于其他請查看 also available.
+ NAME – 你的數據庫名。如果你使用 SQLite,該數據庫將是你計算機上的一個文件;在這種情況下,NAME 將是一個完整的絕對路徑,而且還包含該文件的名稱。如果該文件不存在,它會在第一次同步數據庫時自動創建(見下文)。
當指定路徑時,總是使用正斜杠,即使是在 Windows 下(例如:``C:/homes/user/mysite/sqlite3.db``) 。
+ USER – 你的數據庫用戶名 ( SQLite 下不需要) 。
+ PASSWORD – 你的數據庫密碼 ( SQLite 下不需要) 。
+ HOST – 你的數據庫主機地址。如果和你的數據庫服務器是同一臺物理機器,請將此處保留為空 (或者設置為 127.0.0.1) ( SQLite 下不需要) 。查看 HOST 了解詳細信息。
如果你是新建數據庫,我們建議只使用 SQLite ,將 ENGINE 改為 'django.db.backends.sqlite3' 并且將 NAME 設置為你想存放數據庫的地方。 SQLite 是內置在 Python 中的,因此你不需要安裝任何東西來支持你的數據庫。
> Note
>
> 如果你使用 PostgreSQL 或者 MySQL,確保你已經創建了一個數據庫。還是通過你的數據庫交互接口中的 “CREATE DATABASE database_name;” 命令做到這一點的。
> 如果你使用 SQLite ,你不需要事先創建任何東西 - 在需要的時候,將會自動創建數據庫文件。
當你編輯 settings.py 時,將 TIME_ZONE 修改為你所在的時區。默認值是美國中央時區(芝加哥)。
同時,注意文件底部的 INSTALLED_APPS 設置。它保存了當前 Django 實例已激活的所有 Django 應用。每個應用可以被多個項目使用,而且你可以打包和分發給其他人在他們的項目中使用。
默認情況下,INSTALLED_APPS 包含以下應用,這些都是由 Django 提供的:
+ django.contrib.auth – 身份驗證系統。
+ django.contrib.contenttypes – 內容類型框架。
+ django.contrib.sessions – session 框架。
+ django.contrib.sites – 網站管理框架。
+ django.contrib.messages – 消息框架。
+ django.contrib.staticfiles – 靜態文件管理框架。
這些應用在一般情況下是默認包含的。
所有這些應用中每個應用至少使用一個數據庫表,所以在使用它們之前我們需要創建數據庫中的表。要做到這一點,請運行以下命令:
```
python manage.py syncdb
```
syncdb 命令參照 INSTALLED_APPS 設置,并在你的 settings.py 文件所配置的數據庫中創建必要的數據庫表。每創建一個數據庫表你都會看到一條消息,接著你會看到一個提示詢問你是否想要在身份驗證系統內創建個超級用戶。按提示輸入后結束。
如果你感興趣,可以在你的數據庫命令行下輸入:``dt`` (PostgreSQL), SHOW TABLES; (MySQL), 或 .schema (SQLite) 來列出 Django 所創建的表。
> 極簡主義者
>
> 就像我們上面所說的,一般情況下以上應用都默認包含在內,但不是每個人都需要它們。如果不需要某些或全部應用,在運行 syncdb 命令前可從 INSTALLED_APPS 內隨意注釋或刪除相應的行。syncdb 命令只會為 INSTALLED_APPS 內的應用創建表。
## 創建模型 ##
現在你的項目開發環境建立好了, 你可以開工了。
你通過 Djaong 編寫的每個應用都是由 Python 包組成的,這些包存放在你的 Python path 中并且遵循一定的命名規范。 Django 提供了個實用工具可以自動生成一個應用的基本目錄架構,因此你可以專注于編寫代碼而不是去創建目錄。
> 項目 ( Projects ) vs. 應用 ( apps )
>
> 項目與應用之間有什么不同之處?應用是一個提供功能的 Web 應用 – 例如:一個博客系統、一個公共記錄的數據庫或者一個簡單的投票系統。 項目是針對一個特定的 Web 網站相關的配置和其應用的組合。一個項目可以包含多個應用。一個應用可以在多個項目中使用。
你的應用可以存放在 Python path 中的任何位置。在本教材中,我們將通過你的 manage.py 文件創建我們的投票應用,以便它可以作為頂層模塊導入,而不是作為 mysite 的子模塊。
要創建你的應用,請確認與 manage.py 文件在同一的目錄下并輸入以下命令:
```
python manage.py startapp polls
```
這將創建一個 polls 目錄,其展開的樣子如下所示::
```
polls/
__init__.py
models.py
tests.py
views.py
```
此目錄結構就是投票應用。
在 Django 中編寫一個有數據庫支持的 Web 應用的第一步就是定義你的模型 – 從本質上講就是數據庫設計及其附加的元數據。
> 哲理
>
> 模型是有關你數據的唯一且明確的數據源。它包含了你所要存儲的數據的基本字段和行為。 Django 遵循 DRY 原則 。目標是為了只在一個地方定義你的數據模型就可從中自動獲取數據。
在這簡單的投票應用中,我們將創建兩個模型: Poll 和 Choice``。``Poll 有問題和發布日期兩個字段。``Choice`` 有兩個字段: 選項 ( choice ) 的文本內容和投票數。每一個 Choice 都與一個 Poll 關聯。
這些概念都由簡單的 Python 類來表現。編輯 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)
```
代碼很簡單。每個模型都由繼承自 django.db.models.Model 子類的類來描述。 每個模型都有一些類變量,每一個類變量都代表了一個數據庫字段。
每個字段由一個 Field 的實例來表現 – 比如 CharField 表示字符類型的字段和 DateTimeField 表示日期時間型的字段。這會告訴 Django 每個字段都保存了什么類型的數據。
每一個 Field 實例的名字就是字段的名字(如: question 或者 pub_date ),其格式屬于親和機器式的。在你的 Python 的代碼中會使用這個值,而你的數據庫會將這個值作為表的列名。
你可以在初始化 Field 實例時使用第一個位置的可選參數來指定人類可讀的名字。這在Django的內省部分中被使用到了,而且兼作文檔的一部分來增強代碼的可讀性。若字段未提供該參數,Django 將使用符合機器習慣的名字。在本例中,我們僅定義了一個符合人類習慣的字段名 Poll.pub_date 。對于模型中的其他字段,機器名稱就已經足夠替代人類名稱了。
一些 Field 實例是需要參數的。 例如 CharField 需要你指定 `~django.db.models.CharField.max_length`。這不僅適用于數據庫結構,以后我們還會看到也用于數據驗證中。
一個 Field 實例可以有不同的可選參數; 在本例中,我們將 votes 的 default 的值設為 0 。
最后,注意我們使用了 ForeignKey 定義了一個關聯。它告訴 Django 每一個``Choice`` 關聯一個 Poll 。 Django 支持常見數據庫的所有關聯:多對一( many-to-ones ),多對多( many-to-manys ) 和 一對一 ( one-to-ones )。
## 激活模型 ##
剛才那點模型代碼提供給 Django 大量信息。有了這些 Django 就可以做:
為該應用創建對應的數據庫架構 (CREATE TABLE statements) 。
為 Poll 和 Choice 對象創建 Python 訪問數據庫的 API 。
但首先,我們需要告訴我們的項目已經安裝了 polls 應用。
> 哲理
>
> Django 應用是“可插拔的”:你可以在多個項目使用一個應用,你還可以分發應用,因為它們沒有被捆綁到一個給定的 Django 安裝環境中。
再次編輯 settings.py 文件,在 INSTALLED_APPS 設置中加入 'polls' 字符。因此結果如下所示:
```
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',
)
```
現在 Django 已經知道包含了 polls 應用。讓我們運行如下命令:
```
python manage.py sql polls
```
你將看到類似如下所示內容 ( 有關投票應用的 CREATE TABLE SQL 語句 ):
```
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;
```
請注意如下事項:
+ 確切的輸出內容將取決于您使用的數據庫會有所不同。
+ 表名是自動生成的,通過組合應用名 (polls) 和小寫的模型名 – poll 和 choice 。 ( 你可以重寫此行為。)
+ 主鍵 (IDs) 是自動添加的。( 你也可以重寫此行為。)
+ 按照慣例,Django 會在外鍵字段名上附加 "_id" 。 ( 是的,你仍然可以重寫此行為。)
+ 外鍵關系由 REFERENCES 語句顯示聲明。
+ 生成 SQL 語句時針對你所使用的數據庫,會為你自動處理特定于數據庫的字段,例如 auto_increment (MySQL), serial (PostgreSQL), 或 or integer primary key (SQLite) 。 在引用字段名時也是如此 – 比如使用雙引號或單引號。 本教材的作者所使用的是 PostgreSQL,因此例子中輸出的是 PostgreSQL 的語法。
+ 這些 sql 命令其實并沒有在你的數據庫中運行過 - 它只是在屏幕上顯示出來,以便讓你了解 Django 認為什么樣的 SQL 是必須的。 如果你愿意,可以把 SQL 復制并粘帖到你的數據庫命令行下去執行。 但是,我們很快就能看到, Django 提供了一個更簡單的方法來執行此 SQL 。
如果你感興趣,還可以運行以下命令:
+ python manage.py validate – 檢查在構建你的模型時是否有錯誤。
+ python manage.py sqlcustom polls – 輸出為應用定義的任何 custom SQL statements ( 例如表或約束的修改 ) 。
+ python manage.py sqlclear polls – 根據存在于你的數據庫中的表 (如果有的話) ,為應用輸出必要的 DROP TABLE 。
+ python manage.py sqlindexes polls – 為應用輸出 CREATE INDEX 語句。
+ python manage.py sqlall polls – 輸出所有 SQL 語句:sql, sqlcustom, 和 sqlindexes 。
看看這些輸出的命令可以幫助你理解框架底層實際上處理了些什么。
現在,再次運行 syncdb 命令在你的數據庫中創建這些模型對應的表:
```
python manage.py syncdb
```
syncdb 命令會給在 INSTALLED_APPS 中有但數據庫中沒有對應表的應用執行 sqlall 操作。 該操作會為你上一次執行 syncdb 命令以來在項目中添加的任何應用創建對應的表、初始化數據和創建索引。 syncdb 命令只要你喜歡就可以任意調用,并且它僅會創建不存在的表。
請閱讀 django-admin.py documentation 文檔了解 manage.py 工具更多的功能。
## 玩轉 API ##
現在,我們進入 Python 的交互式 shell 中玩弄 Django 提供給你的 API 。要調用 Python sell ,使用如下命令:
```
python manage.py shell
```
我們當前使用的環境不同于簡單的輸入 “python” 進入的 shell 環境,因為 manage.py 設置了 DJANGO_SETTINGS_MODULE 環境變量,該變量給定了 Django 需要導入的 settings.py 文件所在路徑。
> 忽略 manage.py
>
> 若你不想使用 manage.py ,也是沒有問題的。 僅需要將 DJANGO_SETTINGS_MODULE 環境變量值設為 mysite.settings 并在與 manage.py 文件所在同一目錄下運行 python ( 或確保目錄在 Python path 下,那 import mysite 就可以了 )。
>
> 想了解更多的信息,請參考 django-admin.py 文檔 。
一旦你進入了 shell,就可通過 database API 來瀏覽數據::
```
>>> from polls.models import Poll, Choice # Import the model classes we just wrote.
# 系統中還沒有 polls 。
>>> Poll.objects.all()
[]
# 創建一個新 Poll 。
# 在默認配置文件中時區支持配置是啟用的,
# 因此 Django 希望為 pub_date 字段獲取一個 datetime with tzinfo 。使用了 timezone.now()
# 而不是 datetime.datetime.now() 以便獲取正確的值。
>>> from django.utils import timezone
>>> p = Poll(question="What's new?", pub_date=timezone.now())
# 保存對象到數據庫中。你必須顯示調用 save() 方法。
>>> p.save()
# 現在對象擁有了一個ID 。請注意這可能會顯示 "1L" 而不是 "1",取決于
# 你正在使用的數據庫。 這沒什么大不了的,它只是意味著你的數據庫后端
# 喜歡返回的整型數作為 Python 的長整型對象而已。
>>> p.id
1
# 通過 Python 屬性訪問數據庫中的列。
>>> p.question
"What's new?"
>>> p.pub_date
datetime.datetime(2012, 2, 26, 13, 0, 0, 775217, tzinfo=<UTC>)
# 通過改為屬性值來改變值,然后調用 save() 方法。
>>> p.question = "What's up?"
>>> p.save()
# objects.all() 用以顯示數據庫中所有的 polls 。
>>> Poll.objects.all()
[<Poll: Poll object>]
```
請稍等。``<Poll: Poll object>`` 這樣顯示對象絕對是無意義的。 讓我們編輯 polls 模型( 在 polls/models.py 文件中 ) 并且給 Poll 和 Choice 都添加一個 __unicode__() 方法來修正此錯誤:
```
class Poll(models.Model):
# ...
def __unicode__(self):
return self.question
class Choice(models.Model):
# ...
def __unicode__(self):
return self.choice_text
```
給你的模型添加 __unicode__() 方法是很重要的, 不僅是讓你在命令行下有明確提示,而且在 Django 自動生成的管理界面中也會使用到對象的呈現。
> 為什么是 __unicode__() 而不是 __str__()?
>
> 如果你熟悉 Python,那么你可能會習慣在類中添加 __str__() 方法而不是 __unicode__() 方法。 We use 我們在這里使用 __unicode__() 是因為 Django 模型默認處理的是 Unicode 格式。當所有存儲在數據庫中的數據返回時都會轉換為 Unicode 的格式。
>
> Django 模型有個默認的 __str__() 方法 會去調用 __unicode__() 并將結果轉換為 UTF-8 編碼的字符串。這就意味著 unicode(p) 會返回一個 Unicode 字符串,而 str(p) 會返回一個以 UTF-8 編碼的普通字符串。
>
> 如果這讓你感覺困惑,那么你只要記住在模型中添加 __unicode__() 方法。 運氣好的話,這些代碼會正常運行。
請注意這些都是普通的 Python 方法。讓我們來添加個自定義方法,為了演示而已:
```
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)
```
請注意,增加了 import datetime 和 from django.utils import timezone, 是為了分別引用 Python 的標準庫 datetime 模塊和 Django 的 django.utils.timezone 中的 time-zone-related 實用工具 。如果你不熟悉在 Python 中處理時區,你可以在 時區支持文檔 學到更多。
保存這些更改并且再次運行 python manage.py shell 以開啟一個新的 Python shell:
```
>>> from polls.models import Poll, Choice
# 確認我們附加的 __unicode__() 正常運行。
>>> Poll.objects.all()
[<Poll: What's up?>]
# Django 提供了一個豐富的數據庫查詢 API ,
# 完全由關鍵字參數來驅動。
>>> Poll.objects.filter(id=1)
[<Poll: What's up?>]
>>> Poll.objects.filter(question__startswith='What')
[<Poll: What's up?>]
# 獲取今年發起的投票。
>>> from django.utils import timezone
>>> current_year = timezone.now().year
>>> Poll.objects.get(pub_date__year=current_year)
<Poll: What's up?>
# 請求一個不存在的 ID ,這將引發一個異常。
>>> Poll.objects.get(id=2)
Traceback (most recent call last):
...
DoesNotExist: Poll matching query does not exist. Lookup parameters were {'id': 2}
# 根據主鍵查詢是常見的情況,因此 Django 提供了一個
# 主鍵精確查找的快捷方式。
# 以下代碼等同于 Poll.objects.get(id=1).
>>> Poll.objects.get(pk=1)
<Poll: What's up?>
# 確認我們自定義方法正常運行。
>>> p = Poll.objects.get(pk=1)
>>> p.was_published_recently()
True
# 給 Poll 設置一些 Choices 。通過 create 方法調用構造方法去創建一個新
# Choice 對象實例,執行 INSERT 語句后添加該 choice 到
# 可用的 choices 集中并返回這個新建的 Choice 對象實例。 Django 創建了
# 一個保存外鍵關聯關系的集合 ( 例如 poll 的 choices) 以便可以通過 API
# 去訪問。
>>> p = Poll.objects.get(pk=1)
# 從關聯對象集中顯示所有 choices -- 到目前為止還沒有。
>>> p.choice_set.all()
[]
# 創建三個 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 對象擁有訪問它們關聯的 Poll 對象的 API 。
>>> c.poll
<Poll: What's up?>
# 反之亦然: Poll 對象也可訪問 Choice 對象。
>>> p.choice_set.all()
[<Choice: Not much>, <Choice: The sky>, <Choice: Just hacking again>]
>>> p.choice_set.count()
3
# 只要你需要 API 會自動連續關聯。
# 使用雙下劃線來隔離關聯。
# 只要你想要幾層關聯就可以有幾層關聯,沒有限制。
# 尋找和今年發起的任何 poll 有關的所有 Choices
# ( 重用我們在上面建立的 'current_year' 變量 )。
>>> Choice.objects.filter(poll__pub_date__year=current_year)
[<Choice: Not much>, <Choice: The sky>, <Choice: Just hacking again>]
# 讓我們使用 delete() 刪除 choices 中的一個。
>>> c = p.choice_set.filter(choice_text__startswith='Just hacking')
>>> c.delete()
```
欲了解更多有關模型關系的信息,請查看 訪問關聯對象 。欲了解更多有關如何使用雙下劃線來通過 API 執行字段查詢的,請查看 字段查詢 。 如需完整的數據庫 API 信息,請查看我們的 數據庫 API 參考 。
當你對 API 有所了解后, 請查看 教程 第2部分 來學習 Django 的自動生成的管理網站是如何工作的。
> 譯者:[Django 文檔協作翻譯小組](http://python.usyiyi.cn/django/index.html),原文:[Part 1: Models](https://docs.djangoproject.com/en/1.8/intro/tutorial01/)。
>
> 本文以 [CC BY-NC-SA 3.0](http://creativecommons.org/licenses/by-nc-sa/3.0/cn/) 協議發布,轉載請保留作者署名和文章出處。
>
> [Django 文檔協作翻譯小組](http://python.usyiyi.cn/django/index.html)人手緊缺,有興趣的朋友可以加入我們,完全公益性質。交流群:467338606。
- 新手入門
- 從零開始
- 概覽
- 安裝
- 教程
- 第1部分:模型
- 第2部分:管理站點
- 第3部分:視圖和模板
- 第4部分:表單和通用視圖
- 第5部分:測試
- 第6部分:靜態文件
- 高級教程
- 如何編寫可重用的應用
- 為Django編寫首個補丁
- 模型層
- 模型
- 模型語法
- 元選項
- 模型類
- 查詢集
- 執行查詢
- 查找表達式
- 模型的實例
- 實例方法
- 訪問關聯對象
- 遷移
- 模式編輯器
- 編寫遷移
- 高級
- 管理器
- 原始的SQL查詢
- 聚合
- 多數據庫
- 自定義查找
- 條件表達式
- 數據庫函數
- 其它
- 遺留的數據庫
- 提供初始數據
- 優化數據庫訪問
- 視圖層
- 基礎
- URL配置
- 視圖函數
- 快捷函數
- 裝飾器
- 參考
- 內建的視圖
- TemplateResponse 對象
- 文件上傳
- 概覽
- File 對象
- 儲存API
- 管理文件
- 自定義存儲
- 基于類的視圖
- 概覽
- 內建顯示視圖
- 內建編輯視圖
- API參考
- 分類索引
- 高級
- 生成 CSV
- 生成 PDF
- 中間件
- 概覽
- 內建的中間件類
- 模板層
- 基礎
- 面向設計師
- 語言概覽
- 人性化
- 面向程序員
- 表單
- 基礎
- 概覽
- 表單API
- 內建的Widget
- 高級
- 整合媒體
- 開發過程
- 設置
- 概覽
- 應用程序
- 異常
- 概覽
- django-admin 和 manage.py
- 添加自定義的命令
- 測試
- 介紹
- 部署
- 概述
- WSGI服務器
- 部署靜態文件
- 通過email追蹤代碼錯誤
- Admin
- 管理操作
- 管理文檔生成器
- 安全
- 安全概述
- 說明Django中的安全問題
- 點擊劫持保護
- 加密簽名
- 國際化和本地化
- 概述
- 本地化WEB UI格式化輸入
- “本地特色”
- 常見的網站應用工具
- 認證
- 概覽
- 使用認證系統
- 密碼管理
- 日志
- 分頁
- 會話
- 數據驗證
- 其它核心功能
- 按需內容處理
- 重定向
- 信號
- 系統檢查框架