最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

在Django框架中運(yùn)行Python應(yīng)用全攻略

 更新時(shí)間:2015年07月17日 09:55:26   投稿:goldensun  
這篇文章主要介紹了在Django框架中運(yùn)行Python應(yīng)用全攻略,在這之前必須搭建好簡(jiǎn)單的視圖和模版,接下來便是本文中所述的核心內(nèi)容應(yīng)用配置,需要的朋友可以參考下

我們來假定下面的這些概念、字段和關(guān)系:

  •     一個(gè)作者有姓,有名及email地址。
  •     出版商有名稱,地址,所在城市、省,國家,網(wǎng)站。
  •     書籍有書名和出版日期。 它有一個(gè)或多個(gè)作者(和作者是多對(duì)多的關(guān)聯(lián)關(guān)系[many-to-many]), 只有一個(gè)出版商(和出版商是一對(duì)多的關(guān)聯(lián)關(guān)系[one-to-many],也被稱作外鍵[foreign key])

第一步是用Python代碼來描述它們。 打開由`` startapp`` 命令創(chuàng)建的models.py 并輸入下面的內(nèi)容:

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()

讓我們來快速講解一下這些代碼的含義。 首先要注意的事是每個(gè)數(shù)據(jù)模型都是 django.db.models.Model 的子類。它的父類 Model 包含了所有必要的和數(shù)據(jù)庫交互的方法,并提供了一個(gè)簡(jiǎn)潔漂亮的定義數(shù)據(jù)庫字段的語法。 信不信由你,這些就是我們需要編寫的通過Django存取基本數(shù)據(jù)的所有代碼。

每個(gè)模型相當(dāng)于單個(gè)數(shù)據(jù)庫表,每個(gè)屬性也是這個(gè)表中的一個(gè)字段。 屬性名就是字段名,它的類型(例如 CharField )相當(dāng)于數(shù)據(jù)庫的字段類型 (例如 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
);

事實(shí)上,正如過一會(huì)兒我們所要展示的,Django 可以自動(dòng)生成這些 CREATE TABLE 語句。

“每個(gè)數(shù)據(jù)庫表對(duì)應(yīng)一個(gè)類”這條規(guī)則的例外情況是多對(duì)多關(guān)系。 在我們的范例模型中, Book 有一個(gè) 多對(duì)多字段 叫做 authors 。 該字段表明一本書籍有一個(gè)或多個(gè)作者,但 Book 數(shù)據(jù)庫表卻并沒有 authors 字段。 相反,Django創(chuàng)建了一個(gè)額外的表(多對(duì)多連接表)來處理書籍和作者之間的映射關(guān)系。

請(qǐng)查看附錄 B 了解所有的字段類型和模型語法選項(xiàng)。

最后需要注意的是,我們并沒有顯式地為這些模型定義任何主鍵。 除非你單獨(dú)指明,否則Django會(huì)自動(dòng)為每個(gè)模型生成一個(gè)自增長的整數(shù)主鍵字段每個(gè)Django模型都要求有單獨(dú)的主鍵。
模型安裝

完成這些代碼之后,現(xiàn)在讓我們來在數(shù)據(jù)庫中創(chuàng)建這些表。 要完成該項(xiàng)工作,第一步是在 Django 項(xiàng)目中 激活 這些模型。 將 books app 添加到配置文件的已安裝應(yīng)用列表中即可完成此步驟。

再次編輯 settings.py 文件, 找到 INSTALLED_APPS 設(shè)置。 INSTALLED_APPS 告訴 Django 項(xiàng)目哪些 app 處于激活狀態(tài)。 缺省情況下如下所示:

INSTALLED_APPS = (
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.sites',
)

把這四個(gè)設(shè)置前面加#臨時(shí)注釋起來。 (這四個(gè)app是經(jīng)常使用到的,我們將在后續(xù)章節(jié)里討論如何使用它們)。同時(shí),注釋掉MIDDLEWARE_CLASSES的默認(rèn)設(shè)置條目,因?yàn)檫@些條目是依賴于剛才我們剛在INSTALLED_APPS注釋掉的apps。 然后,添加`` ‘mysite.books'`` 到`` INSTALLED_APPS`` 的末尾,此時(shí)設(shè)置的內(nèi)容看起來應(yīng)該是這樣的:

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',
)

(就像我們?cè)谏弦徽略O(shè)置TEMPLATE_DIRS所提到的逗號(hào),同樣在INSTALLED_APPS的末尾也需添加一個(gè)逗號(hào),因?yàn)檫@是個(gè)單元素的元組。 另外,本書的作者喜歡在 每一個(gè) tuple元素后面加一個(gè)逗號(hào),不管它是不是 只有一個(gè)元素。 這是為了避免忘了加逗號(hào),而且也沒什么壞處。)

'mysite.books'指示我們正在編寫的books app。 INSTALLED_APPS 中的每個(gè)app都使用 Python的路徑描述,包的路徑,用小數(shù)點(diǎn)“.”間隔。

現(xiàn)在我們可以創(chuàng)建數(shù)據(jù)庫表了。 首先,用下面的命令驗(yàn)證模型的有效性:

python manage.py validate

validate 命令檢查你的模型的語法和邏輯是否正確。 如果一切正常,你會(huì)看到 0 errors found 消息。如果出錯(cuò),請(qǐng)檢查你輸入的模型代碼。 錯(cuò)誤輸出會(huì)給出非常有用的錯(cuò)誤信息來幫助你修正你的模型。

一旦你覺得你的模型可能有問題,運(yùn)行 python manage.py validate 。 它可以幫助你捕獲一些常見的模型定義錯(cuò)誤。

模型確認(rèn)沒問題了,運(yùn)行下面的命令來生成 CREATE TABLE 語句(如果你使用的是Unix,那么可以啟用語法高亮):

python manage.py sqlall books

在這個(gè)命令行中, books 是app的名稱。 和你運(yùn)行 manage.py startapp 中的一樣。執(zhí)行之后,輸出如下:

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;

注意:

  •     自動(dòng)生成的表名是app名稱( books )和模型的小寫名稱 ( publisher , book , author )的組合。你可以參考附錄B重寫這個(gè)規(guī)則。
  •     我們前面已經(jīng)提到,Django為每個(gè)表格自動(dòng)添加加了一個(gè) id 主鍵, 你可以重新設(shè)置它。
  •     按約定,Django添加 "_id" 后綴到外鍵字段名。 你猜對(duì)了,這個(gè)同樣是可以自定義的。
  •     外鍵是用 REFERENCES 語句明確定義的。
  •     這些 CREATE TABLE 語句會(huì)根據(jù)你的數(shù)據(jù)庫而作調(diào)整,這樣象數(shù)據(jù)庫特定的一些字段例如:(MySQL),auto_increment(PostgreSQL),serial(SQLite),都會(huì)自動(dòng)生成。integer primary key 同樣的,字段名稱也是自動(dòng)處理(例如單引號(hào)還好是雙引號(hào))。 例子中的輸出是基于PostgreSQL語法的。

sqlall 命令并沒有在數(shù)據(jù)庫中真正創(chuàng)建數(shù)據(jù)表,只是把SQL語句段打印出來,這樣你可以看到Django究竟會(huì)做些什么。 如果你想這么做的話,你可以把那些SQL語句復(fù)制到你的數(shù)據(jù)庫客戶端執(zhí)行,或者通過Unix管道直接進(jìn)行操作(例如,`` python manager.py sqlall books | psql mydb`` )。不過,Django提供了一種更為簡(jiǎn)易的提交SQL語句至數(shù)據(jù)庫的方法: `` syncdb`` 命令

python manage.py syncdb

執(zhí)行這個(gè)命令后,將看到類似以下的內(nèi)容:

Creating table books_publisher
Creating table books_author
Creating table books_book
Installing index for books.Book model

syncdb 命令是同步你的模型到數(shù)據(jù)庫的一個(gè)簡(jiǎn)單方法。 它會(huì)根據(jù) INSTALLED_APPS 里設(shè)置的app來檢查數(shù)據(jù)庫, 如果表不存在,它就會(huì)創(chuàng)建它。 需要注意的是, syncdb 并 不能將模型的修改或刪除同步到數(shù)據(jù)庫;如果你修改或刪除了一個(gè)模型,并想把它提交到數(shù)據(jù)庫,syncdb并不會(huì)做出任何處理。 (更多內(nèi)容請(qǐng)查看本章最后的“修改數(shù)據(jù)庫的架構(gòu)”一段。)

如果你再次運(yùn)行 python manage.py syncdb ,什么也沒發(fā)生,因?yàn)槟銢]有添加新的模型或者 添加新的app。因此,運(yùn)行python manage.py syncdb總是安全的,因?yàn)樗粫?huì)重復(fù)執(zhí)行SQL語句。

如果你有興趣,花點(diǎn)時(shí)間用你的SQL客戶端登錄進(jìn)數(shù)據(jù)庫服務(wù)器看看剛才Django創(chuàng)建的數(shù)據(jù)表。 你可以手動(dòng)啟動(dòng)命令行客戶端(例如,執(zhí)行PostgreSQL的`` psql`` 命令),也可以執(zhí)行 `` python manage.py dbshell`` ,這個(gè)命令將依據(jù)`` DATABASE_SERVER`` 的里設(shè)置自動(dòng)檢測(cè)使用哪種命令行客戶端。 常言說,后來者居上。
基本數(shù)據(jù)訪問

一旦你創(chuàng)建了模型,Django自動(dòng)為這些模型提供了高級(jí)的Python API。 運(yùn)行 python manage.py shell 并輸入下面的內(nèi)容試試看:

>>> from books.models import Publisher
>>> p1 = Publisher(name='Apress', address='2855 Telegraph Avenue',
...  city='Berkeley', state_province='CA', country='U.S.A.',
...  website='http://www.apress.com/')
>>> p1.save()
>>> p2 = Publisher(name="O'Reilly", address='10 Fawcett St.',
...  city='Cambridge', state_province='MA', country='U.S.A.',
...  website='http://www.oreilly.com/')
>>> p2.save()
>>> publisher_list = Publisher.objects.all()
>>> publisher_list
[<Publisher: Publisher object>, <Publisher: Publisher object>]

這短短幾行代碼干了不少的事。 這里簡(jiǎn)單的說一下:

  •     首先,導(dǎo)入Publisher模型類, 通過這個(gè)類我們可以與包含 出版社 的數(shù)據(jù)表進(jìn)行交互。
  •     接著,創(chuàng)建一個(gè)`` Publisher`` 類的實(shí)例并設(shè)置了字段`` name, address`` 等的值。
  •     調(diào)用該對(duì)象的 save() 方法,將對(duì)象保存到數(shù)據(jù)庫中。 Django 會(huì)在后臺(tái)執(zhí)行一條 INSERT 語句。
  •     最后,使用`` Publisher.objects`` 屬性從數(shù)據(jù)庫取出出版商的信息,這個(gè)屬性可以認(rèn)為是包含出版商的記錄集。 這個(gè)屬性有許多方法, 這里先介紹調(diào)用`` Publisher.objects.all()`` 方法獲取數(shù)據(jù)庫中`` Publisher`` 類的所有對(duì)象。這個(gè)操作的幕后,Django執(zhí)行了一條SQL `` SELECT`` 語句。

這里有一個(gè)值得注意的地方,在這個(gè)例子可能并未清晰地展示。 當(dāng)你使用Django modle API創(chuàng)建對(duì)象時(shí)Django并未將對(duì)象保存至數(shù)據(jù)庫內(nèi),除非你調(diào)用`` save()`` 方法:

p1 = Publisher(...)
# At this point, p1 is not saved to the database yet!
p1.save()
# Now it is.

如果需要一步完成對(duì)象的創(chuàng)建與存儲(chǔ)至數(shù)據(jù)庫,就使用`` objects.create()`` 方法。 下面的例子與之前的例子等價(jià):

>>> p1 = Publisher.objects.create(name='Apress',
...  address='2855 Telegraph Avenue',
...  city='Berkeley', state_province='CA', country='U.S.A.',
...  website='http://www.apress.com/')
>>> p2 = Publisher.objects.create(name="O'Reilly",
...  address='10 Fawcett St.', city='Cambridge',
...  state_province='MA', country='U.S.A.',
...  website='http://www.oreilly.com/')
>>> publisher_list = Publisher.objects.all()
>>> publisher_list

當(dāng)然,你肯定想執(zhí)行更多的Django數(shù)據(jù)庫API試試看,不過,還是讓我們先解決一點(diǎn)煩人的小問題。

添加模塊的字符串表現(xiàn)

當(dāng)我們打印整個(gè)publisher列表時(shí),我們沒有得到想要的有用信息,無法把````對(duì)象區(qū)分開來:

System Message: WARNING/2 (<string>, line 872); backlink

Inline literal start-string without end-string.

System Message: WARNING/2 (<string>, line 872); backlink

Inline literal start-string without end-string.

[<Publisher: Publisher object>, <Publisher: Publisher object>]

我們可以簡(jiǎn)單解決這個(gè)問題,只需要為Publisher 對(duì)象添加一個(gè)方法 __unicode__() 。 __unicode__() 方法告訴Python如何將對(duì)象以u(píng)nicode的方式顯示出來。 為以上三個(gè)模型添加__unicode__()方法后,就可以看到效果了:

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()

 **def __unicode__(self):**
  **return self.name**

class Author(models.Model):
 first_name = models.CharField(max_length=30)
 last_name = models.CharField(max_length=40)
 email = models.EmailField()

 **def __unicode__(self):**
  **return u'%s %s' % (self.first_name, self.last_name)**

class Book(models.Model):
 title = models.CharField(max_length=100)
 authors = models.ManyToManyField(Author)
 publisher = models.ForeignKey(Publisher)
 publication_date = models.DateField()

 **def __unicode__(self):**
  **return self.title**

就象你看到的一樣, __unicode__() 方法可以進(jìn)行任何處理來返回對(duì)一個(gè)對(duì)象的字符串表示。 Publisher和Book對(duì)象的__unicode__()方法簡(jiǎn)單地返回各自的名稱和標(biāo)題,Author對(duì)象的__unicode__()方法則稍微復(fù)雜一些,它將first_name和last_name字段值以空格連接后再返回。

對(duì)__unicode__()的唯一要求就是它要返回一個(gè)unicode對(duì)象 如果`` __unicode__()`` 方法未返回一個(gè)Unicode對(duì)象,而返回比如說一個(gè)整型數(shù)字,那么Python將拋出一個(gè)`` TypeError`` 錯(cuò)誤,并提示:”coercing to Unicode: need string or buffer, int found” 。

相關(guān)文章

  • Python的Django框架中設(shè)置日期和字段可選的方法

    Python的Django框架中設(shè)置日期和字段可選的方法

    這篇文章主要介紹了Python的Django框架中設(shè)置日期和字段可選的方法,是Django設(shè)置當(dāng)中的基本操作,需要的朋友可以參考下
    2015-07-07
  • Python Web框架Tornado運(yùn)行和部署

    Python Web框架Tornado運(yùn)行和部署

    這篇文章主要為大家詳細(xì)介紹了Python Web框架Tornado運(yùn)行和部署的相關(guān)資料,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-04-04
  • python爬蟲指南之xpath實(shí)例解析(附實(shí)戰(zhàn))

    python爬蟲指南之xpath實(shí)例解析(附實(shí)戰(zhàn))

    在進(jìn)行網(wǎng)頁抓取的時(shí)候,分析定位html節(jié)點(diǎn)是獲取抓取信息的關(guān)鍵,目前我用的是lxml模塊,下面這篇文章主要給大家介紹了關(guān)于python爬蟲指南之xpath實(shí)例解析的相關(guān)資料,需要的朋友可以參考下
    2022-01-01
  • 淺談python中np.array的shape( ,)與( ,1)的區(qū)別

    淺談python中np.array的shape( ,)與( ,1)的區(qū)別

    今天小編就為大家分享一篇python中np.array的shape ( ,)與( ,1)的區(qū)別,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-06-06
  • python中如何打包用戶自定義模塊

    python中如何打包用戶自定義模塊

    在本篇文章里小編給大家整理的是一篇關(guān)于python中如何打包用戶自定義模塊的相關(guān)文章,有興趣的朋友們可以參考下。
    2020-09-09
  • Python提取PDF指定內(nèi)容并生成新文件

    Python提取PDF指定內(nèi)容并生成新文件

    本文為你展示,如何用Python把許多PDF文件的文本內(nèi)容批量提取出來,并且整理存儲(chǔ)到數(shù)據(jù)框中,以便于后續(xù)的數(shù)據(jù)分析。感興趣的可以了解一下
    2021-06-06
  • 詳解scrapy內(nèi)置中間件的順序

    詳解scrapy內(nèi)置中間件的順序

    這篇文章主要介紹了詳解scrapy內(nèi)置中間件的順序,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • python實(shí)現(xiàn)圖像外邊界跟蹤操作

    python實(shí)現(xiàn)圖像外邊界跟蹤操作

    這篇文章主要介紹了python實(shí)現(xiàn)圖像外邊界跟蹤操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-07-07
  • 搞定這套Python爬蟲面試題(面試會(huì)so easy)

    搞定這套Python爬蟲面試題(面試會(huì)so easy)

    Python 是一門開源的解釋性語言,相比 Java C++ 等語言,Python 具有動(dòng)態(tài)特性,非常靈活。這篇文章主要介紹了搞定這套Python爬蟲面試題,面試會(huì)so easy,需要的朋友可以參考下
    2019-04-04
  • python 在某.py文件中調(diào)用其他.py內(nèi)的函數(shù)的方法

    python 在某.py文件中調(diào)用其他.py內(nèi)的函數(shù)的方法

    這篇文章主要介紹了python 在某.py文件中調(diào)用其他.py內(nèi)的函數(shù)的方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-06-06

最新評(píng)論

繁峙县| 永康市| 循化| 兴隆县| 虞城县| 淄博市| 景泰县| 紫金县| 宁海县| 五寨县| 女性| 恩平市| 将乐县| 安达市| 同心县| 始兴县| 长治县| 祁连县| 全州县| 肇州县| 祥云县| 晋城| 曲阜市| 沙田区| 余干县| 天镇县| 哈尔滨市| 家居| 封丘县| 乃东县| 富川| 桐柏县| 石门县| 揭阳市| 吉木乃县| 平潭县| 修水县| 新宁县| 贺州市| 瑞安市| 大同市|