總結一下這幾天學習django的心得
http://www.tuicool.com/articles/jMVB3e
時間 2014-01-12 11:40:11
CSDN部落格原文
http://blog.csdn.net/jackrex/article/details/18180279主題
Django 資料庫Python 是個門十分簡潔 好用的程式設計語言,我之前熟悉的是Java 但是用了Python之後 ,發現python的文法還有結構十厘清晰,比如強制的縮進,空行,給人的感覺是,寫出來的代碼很整潔,非常幹淨漂亮。外加上Python 的各種架構十分之多,從webpy ,jdango .使用python 開發十分快捷。鑒于 性能上,jdango 還是比較重的。可以支撐的比其他的架構要好的很多。另外,python 的開源的庫十分居多,我們可以使用 python 的pip sudo pip install XXX 來友善安裝,汗,我之前還一直用的是 python setup.py install .都是一個一個下載下傳下來;哎。。。。。
說道python 。如果有對python 文法不熟悉的同學,直接在網上看 python基礎教程 或者其他,有的同學喜歡買書,我也買了幾本,但是一直都沒有看,東西都是從網上學來的,雖說有點雜,但是經常總結總結應該說還是不錯的。
好了,直接開始一點Django 的學習吧。 首先推薦的是 pythontip.com 這裡面有Django 和python 學習教程,這些東西自學完成 後 估計python 和jdango 都入了門了,然後在
進階進階的。那就是後話了。
PS 我用的是mac 下得PyCharm 開發python 爽歪歪
1. 如何建立 Django 工程
一個工程裡面包裹好多Apps
首先你進入一個檔案夾中 (你已經安裝了jdango 你可以用setup.py 也可以用我前面說的pip) 然後執行 django-admin.py startproject mysite 這樣會在目錄下建立一個 mysite
的檔案夾,這時候包含了4個檔案。
__init__.py
manage.py
settings.py
urls.py
檔案如下:
- __init__.py :讓 Python 把該目錄當成一個開發包 (即一組子產品)所需的檔案。 這是一個空檔案,一般你不需要修改它。
-
manage.py :一種指令行工具,允許你以多種方式與該 Django 項目進行互動。 鍵入 python manage.py help ,看一下它能做什麼。 你應當不需要編輯這個檔案;在這個目錄下生成它純是為了友善。
5
- settings.py :該 Django 項目的設定或配置。 檢視并了解這個檔案中可用的設定類型及其預設值。
- urls.py :Django項目的URL設定。 可視其為你的django網站的目錄。 目前,它是空的。
盡管這些的檔案很小,但這些檔案已經構成了一個可運作的Django應用。
2 然後進行 python manage.py runserver
Validating models...
0 errors found.
Django version 1.0, using settings 'mysite.settings'
Development server is running at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
這将會在端口8000啟動一個本地伺服器, 并且隻能從你的這台電腦連接配接和通路。 既然伺服器已經運作起來了,現在用網頁浏覽器通路
http://127.0.0.1:8000/。 你應該可以看到一個令人賞心悅目的淡藍色Django歡迎頁面。 它開始工作了。
更改 端接口
更改這個 Development Server 的主機位址或端口
預設情況下, runserver 指令在 8000 端口啟動開發伺服器,且僅監聽本地連接配接。 要想要更改伺服器端口的話,可将端口作為指令行參數傳入:
python manage.py runserver 8080
通過指定一個 IP 位址,你可以告訴伺服器–允許非本地連接配接通路。 如果你想和其他開發人員共享同一開發站點的話,該功能特别有用。 `` 0.0.0.0`` 這個 IP 位址,告訴伺服器去偵聽任意的網絡接口。
4
python manage.py runserver 0.0.0.0:8000
完成這些設定後,你本地網絡中的其它計算機就可以在浏覽器中通路你的 IP 位址了。比如:
http://192.168.1.103:8000/. (注意,你将需要校閱一下你的網絡配置來決定你在本地網絡中的IP 位址) Unix使用者可以在指令提示符中輸入ifconfig來擷取以上資訊。 使用Windows的使用者,請嘗試使用 ipconfig 指令。
3 接下來,你可以去使用 5中資料庫,可能常用的 有mysql 和sqlite 、
設定資料庫所需擴充卡`` postgresql``PostgreSQL psycopg 1.x版,
http://www.djangoproject.com/r/python-pgsql/1/。
postgresql_psycopg2 PostgreSQL psycopg 2.x版,
http://www.djangoproject.com/r/python-pgsql/mysql MySQL MySQLdb ,
http://www.djangoproject.com/r/python-mysql/.
sqlite3 SQLite如果使用Python 2.5+則不需要擴充卡。
否則就使用 pysqlite ,
http://www.djangoproject.com/r/python-sqlite/oracle Oracle cx_Oracle ,
http://www.djangoproject.com/r/python-oracle/13
4 開始一個新的Apps
在`` mysite`` 項目檔案下輸入下面的指令來建立`` books`` app:
python manage.py startapp books
這個指令并沒有輸出什麼,它隻在 mysite 的目錄裡建立了一個 books 目錄。 讓我們來看看這個目錄的内容:
books/
__init__.py
models.py
tests.py
views.py
這個目錄包含了這個app的模型和視圖。
5 建立資料庫 和models
第一步是用Python代碼來描述它們。 打開由`` startapp`` 指令建立的 models.py 并輸入下面的内容:
1
from django.db import models
class Publisher(models.Model):
name = models.CharField(max_length=30)
address = models.CharField(max_length=50)
city = models.CharField(max_length=60)
state_province = models.CharField(max_length=30)
country = models.CharField(max_length=50)
website = models.URLField()
class Author(models.Model):
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=40)
email = models.EmailField()
class Book(models.Model):
title = models.CharField(max_length=100)
authors = models.ManyToManyField(Author)
publisher = models.ForeignKey(Publisher)
publication_date = models.DateField()
讓我們來快速講解一下這些代碼的含義。 首先要注意的事是每個資料模型都是 django.db.models.Model 的子類。它的父類 Model 包含了所有必要的和資料庫互動的方法,并提供了一個簡潔漂亮的定義資料庫字段的文法。 信不信由你,這些就是我們需要編寫的通過Django存取基本資料的所有代碼。
12
每個模型相當于單個資料庫表,每個屬性也是這個表中的一個字段。 屬性名就是字段名,它的類型(例如 CharField )相當于資料庫的字段類型 (例如 varchar )。例如, Publisher 子產品等同于下面這張表(用PostgreSQL的 CREATE TABLE 文法描述):
CREATE TABLE "books_publisher" (
"id" serial NOT NULL PRIMARY KEY,
"name" varchar(30) NOT NULL,
"address" varchar(50) NOT NULL,
"city" varchar(60) NOT NULL,
"state_province" varchar(30) NOT NULL,
"country" varchar(50) NOT NULL,
"website" varchar(200) NOT NULL
);
事實上,正如過一會兒我們所要展示的,Django 可以自動生成這些 CREATE TABLE 語句。
“每個資料庫表對應一個類”這條規則的例外情況是多對多關系。 在我們的範例模型中, Book 有一個 多對多字段 叫做 authors 。 該字段表明一本書籍有一個或多個作者,但 Book 資料庫表卻并沒有 authors 字段。 相反,Django建立了一個額外的表(多對多連接配接表)來處理書籍和作者之間的映射關系。
8
請檢視附錄 B 了解所有的字段類型和模型文法選項。
6
最後需要注意的是,我們并沒有顯式地為這些模型定義任何主鍵。 除非你單獨指明,否則Django會自動為每個模型生成一個自增長的整數主鍵字段每個Django模型都要求有單獨的主鍵。 id
2
模型安裝
完成這些代碼之後,現在讓我們來在資料庫中建立這些表。 要完成該項工作,第一步是在 Django 項目中 激活 這些模型。 将 books app 添加到配置檔案的已安裝應用清單中即可完成此步驟。
再次編輯 settings.py 檔案, 找到 INSTALLED_APPS 設定。 INSTALLED_APPS 告訴 Django 項目哪些 app 處于激活狀态。 預設情況下如下所示:
3
INSTALLED_APPS = (
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
)
把這四個設定前面加#臨時注釋起來。 (這四個app是經常使用到的,我們将在後續章節裡讨論如何使用它們)。同時,注釋掉MIDDLEWARE_CLASSES的預設設定條目,因為這些條目是依賴于剛才我們剛在INSTALLED_APPS注釋掉的apps。 然後,添加`` ‘mysite.books’`` 到`` INSTALLED_APPS`` 的末尾,此時設定的内容看起來應該是這樣的:
MIDDLEWARE_CLASSES = (
# 'django.middleware.common.CommonMiddleware',
# 'django.contrib.sessions.middleware.SessionMiddleware',
# 'django.contrib.auth.middleware.AuthenticationMiddleware',
)
INSTALLED_APPS = (
# 'django.contrib.auth',
# 'django.contrib.contenttypes',
# 'django.contrib.sessions',
# 'django.contrib.sites',
'mysite.books',
)
(就像我們在上一章設定TEMPLATE_DIRS所提到的逗号,同樣在INSTALLED_APPS的末尾也需添加一個逗号,因為這是個單元素的元組。 另外,本書的作者喜歡在 每一個 tuple元素後面加一個逗号,不管它是不是 隻有一個元素。 這是為了避免忘了加逗号,而且也沒什麼壞處。)
'mysite.books' 訓示我們正在編寫的 books app。 INSTALLED_APPS 中的每個app都使用 Python的路徑描述,包的路徑,用小數點“.”間隔。
現在我們可以建立資料庫表了。 首先,用下面的指令驗證模型的有效性:
python manage.py validate
validate 指令檢查你的模型的文法和邏輯是否正确。 如果一切正常,你會看到 0 errors found 消息。如果出錯,請檢查你輸入的模型代碼。 錯誤輸出會給出非常有用的錯誤資訊來幫助你修正你的模型。
一旦你覺得你的模型可能有問題,運作 python manage.py validate 。 它可以幫助你捕獲一些常見的模型定義錯誤。
模型确認沒問題了,運作下面的指令來生成 CREATE TABLE 語句(如果你使用的是Unix,那麼可以啟用文法高亮):
python manage.py sqlall books
在這個指令行中, books 是app的名稱。 和你運作 manage.py startapp 中的一樣。執行之後,輸出如下:
BEGIN;
CREATE TABLE "books_publisher" (
"id" serial NOT NULL PRIMARY KEY,
"name" varchar(30) NOT NULL,
"address" varchar(50) NOT NULL,
"city" varchar(60) NOT NULL,
"state_province" varchar(30) NOT NULL,
"country" varchar(50) NOT NULL,
"website" varchar(200) NOT NULL
)
;
CREATE TABLE "books_author" (
"id" serial NOT NULL PRIMARY KEY,
"first_name" varchar(30) NOT NULL,
"last_name" varchar(40) NOT NULL,
"email" varchar(75) NOT NULL
)
;
CREATE TABLE "books_book" (
"id" serial NOT NULL PRIMARY KEY,
"title" varchar(100) NOT NULL,
"publisher_id" integer NOT NULL REFERENCES "books_publisher" ("id") DEFERRABLE INITIALLY DEFERRED,
"publication_date" date NOT NULL
)
;
CREATE TABLE "books_book_authors" (
"id" serial NOT NULL PRIMARY KEY,
"book_id" integer NOT NULL REFERENCES "books_book" ("id") DEFERRABLE INITIALLY DEFERRED,
"author_id" integer NOT NULL REFERENCES "books_author" ("id") DEFERRABLE INITIALLY DEFERRED,
UNIQUE ("book_id", "author_id")
)
;
CREATE INDEX "books_book_publisher_id" ON "books_book" ("publisher_id");
COMMIT;
注意:
- 自動生成的表名是app名稱( books )和模型的小寫名稱 ( publisher , book , author )的組合。你可以參考附錄B重寫這個規則。
- 我們前面已經提到,Django為每個表格自動添加加了一個 id 主鍵, 你可以重新設定它。
- 按約定,Django添加 "_id" 字尾到外鍵字段名。 你猜對了,這個同樣是可以自定義的。
- 外鍵是用 REFERENCES 語句明确定義的。
- 這些 CREATE TABLE 語句會根據你的資料庫而作調整,這樣象資料庫特定的一些字段例如:(MySQL), auto_increment (PostgreSQL), serial(SQLite),都會自動生成。 integer primary key 同樣的,字段名稱也是自動處理(例如單引号還好是雙引号)。 例子中的輸出是基于PostgreSQL文法的。
sqlall 指令并沒有在資料庫中真正建立資料表,隻是把SQL語句段列印出來,這樣你可以看到Django究竟會做些什麼。 如果你想這麼做的話,你可以把那些SQL語句複制到你的資料庫用戶端執行,或者通過Unix管道直接進行操作(例如,`` python manager.py sqlall books | psql mydb`` )。不過,Django提供了一種更為簡易的送出SQL語句至資料庫的方法: `` syncdb`` 指令
python manage.py syncdb
執行這個指令後,将看到類似以下的内容:
Creating table books_publisher
Creating table books_author
Creating table books_book
Installing index for books.Book model
syncdb 指令是同步你的模型到資料庫的一個簡單方法。 它會根據 INSTALLED_APPS 裡設定的app來檢查資料庫, 如果表不存在,它就會建立它。 需要注意的是, syncdb 并 不能 将模型的修改或删除同步到資料庫;如果你修改或删除了一個模型,并想把它送出到資料庫, syncdb 并不會做出任何處理。 (更多内容請檢視本章最後的“修改資料庫的架構”一段。)
如果你再次運作 python manage.py syncdb ,什麼也沒發生,因為你沒有添加新的模型或者 添加新的app。是以,運作 python manage.py syncdb 總是安全的,因為它不會重複執行SQL語句。
如果你有興趣,花點時間用你的SQL用戶端登入進資料庫伺服器看看剛才Django建立的資料表。 你可以手動啟動指令行用戶端(例如,執行PostgreSQL的`` psql`` 指令),也可以執行 `` python manage.py dbshell`` ,這個指令将依據`` DATABASE_SERVER`` 的裡設定自動檢測使用哪種指令行用戶端。 常言說,後來者居上。
6 你應該學會使用Context 和模闆(待續)
說明: 本文好多參考 pythontip.com 的Django教程。 在此謝過.