Django4.0 激活模型

2022-03-12 10:34 更新

Django 可以:

  • 為這個應(yīng)用創(chuàng)建數(shù)據(jù)庫 schema(生成 ?CREATE TABLE? 語句)。
  • 創(chuàng)建可以與 ?Question和 ?Choice ?對象進(jìn)行交互的 Python 數(shù)據(jù)庫 API。

但是首先得把 ?polls ?應(yīng)用安裝到我們的項目里。

為了在我們的工程中包含這個應(yīng)用,我們需要在配置類 ?INSTALLED_APPS ?中添加設(shè)置。因為 ?PollsConfig類寫在文件 ?polls/apps.py? 中,所以它的點(diǎn)式路徑是 ?'polls.apps.PollsConfig'?。在文件 ?mysite/settings.py? 中 ?INSTALLED_APPS? 子項添加點(diǎn)式路徑后,它看起來像這樣:

INSTALLED_APPS = [
    'polls.apps.PollsConfig',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

現(xiàn)在你的 Django 項目會包含 ?polls應(yīng)用。接著運(yùn)行下面的命令:

...\> py manage.py makemigrations polls

你將會看到類似于下面這樣的輸出:

Migrations for 'polls':
  polls/migrations/0001_initial.py
    - Create model Question
    - Create model Choice

通過運(yùn)行 ?makemigrations命令,Django 會檢測你對模型文件的修改(在這種情況下,你已經(jīng)取得了新的),并且把修改的部分儲存為一次 遷移。
遷移是 Django 對于模型定義(也就是你的數(shù)據(jù)庫結(jié)構(gòu))的變化的儲存形式 - 它們其實(shí)也只是一些你磁盤上的文件。如果你想的話,你可以閱讀一下你模型的遷移數(shù)據(jù),它被儲存在 ?polls/migrations/0001_initial.py? 里。別擔(dān)心,你不需要每次都閱讀遷移文件,但是它們被設(shè)計成人類可讀的形式,這是為了便于你手動調(diào)整 Django 的修改方式。
Django 有一個自動執(zhí)行數(shù)據(jù)庫遷移并同步管理你的數(shù)據(jù)庫結(jié)構(gòu)的命令 - 這個命令是 ?migrate?,我們馬上就會接觸它 - 但是首先,讓我們看看遷移命令會執(zhí)行哪些 SQL 語句。?sqlmigrate ?命令接收一個遷移的名稱,然后返回對應(yīng)的 SQL:

...\> py manage.py sqlmigrate polls 0001

你將會看到類似下面這樣的輸出:

BEGIN;
--
-- Create model Question
--
CREATE TABLE "polls_question" (
    "id" serial NOT NULL PRIMARY KEY,
    "question_text" varchar(200) NOT NULL,
    "pub_date" timestamp with time zone NOT NULL
);
--
-- Create model Choice
--
CREATE TABLE "polls_choice" (
    "id" serial NOT NULL PRIMARY KEY,
    "choice_text" varchar(200) NOT NULL,
    "votes" integer NOT NULL,
    "question_id" integer NOT NULL
);
ALTER TABLE "polls_choice"
  ADD CONSTRAINT "polls_choice_question_id_c5b4b260_fk_polls_question_id"
    FOREIGN KEY ("question_id")
    REFERENCES "polls_question" ("id")
    DEFERRABLE INITIALLY DEFERRED;
CREATE INDEX "polls_choice_question_id_c5b4b260" ON "polls_choice" ("question_id");

COMMIT;

請注意以下幾點(diǎn):

  • 輸出的內(nèi)容和你使用的數(shù)據(jù)庫有關(guān),上面的輸出示例使用的是 PostgreSQL。
  • 數(shù)據(jù)庫的表名是由應(yīng)用名(?polls?)和模型名的小寫形式( ?question ?和 ?choice?)連接而來。(如果需要,你可以自定義此行為。)
  • 主鍵(IDs)會被自動創(chuàng)建。(當(dāng)然,你也可以自定義。)
  • 默認(rèn)的,Django 會在外鍵字段名后追加字符串 ?"_id"? 。(同樣,這也可以自定義。)
  • 外鍵關(guān)系由 ?FOREIGN KEY? 生成。你不用關(guān)心 ?DEFERRABLE部分,它只是告訴 PostgreSQL,請在事務(wù)全都執(zhí)行完之后再創(chuàng)建外鍵關(guān)系。
  • 生成的 SQL 語句是為你所用的數(shù)據(jù)庫定制的,所以那些和數(shù)據(jù)庫有關(guān)的字段類型,比如 ?auto_increment(MySQL)、 ?serial ?(PostgreSQL)和 ?integer primary key autoincrement? (SQLite),Django 會幫你自動處理。那些和引號相關(guān)的事情 - 例如,是使用單引號還是雙引號 - 也一樣會被自動處理。
  • 這個 ?sqlmigrate ?命令并沒有真正在你的數(shù)據(jù)庫中的執(zhí)行遷移 - 相反,它只是把命令輸出到屏幕上,讓你看看 Django 認(rèn)為需要執(zhí)行哪些 SQL 語句。這在你想看看 Django 到底準(zhǔn)備做什么,或者當(dāng)你是數(shù)據(jù)庫管理員,需要寫腳本來批量處理數(shù)據(jù)庫時會很有用。

現(xiàn)在,再次運(yùn)行 ?migrate ?命令,在數(shù)據(jù)庫里創(chuàng)建新定義的模型的數(shù)據(jù)表:

...\> py manage.py migrate
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, polls, sessions
Running migrations:
  Rendering model states... DONE
  Applying polls.0001_initial... OK

這個 ?migrate命令選中所有還沒有執(zhí)行過的遷移(Django 通過在數(shù)據(jù)庫中創(chuàng)建一個特殊的表 ?django_migrations? 來跟蹤執(zhí)行過哪些遷移)并應(yīng)用在數(shù)據(jù)庫上 - 也就是將你對模型的更改同步到數(shù)據(jù)庫結(jié)構(gòu)上。

遷移是非常強(qiáng)大的功能,它能讓你在開發(fā)過程中持續(xù)的改變數(shù)據(jù)庫結(jié)構(gòu)而不需要重新刪除和創(chuàng)建表 - 它專注于使數(shù)據(jù)庫平滑升級而不會丟失數(shù)據(jù)。我們會在后面的教程中更加深入的學(xué)習(xí)這部分內(nèi)容,現(xiàn)在,你只需要記住,改變模型需要這三步:

編輯 ?models.py? 文件,改變模型。

運(yùn)行 ?python manage.py makemigrations? 為模型的改變生成遷移文件。

運(yùn)行 ?python manage.py migrate? 來應(yīng)用數(shù)據(jù)庫遷移。

數(shù)據(jù)庫遷移被分解成生成和應(yīng)用兩個命令是為了讓你能夠在代碼控制系統(tǒng)上提交遷移數(shù)據(jù)并使其能在多個應(yīng)用里使用;這不僅僅會讓開發(fā)更加簡單,也給別的開發(fā)者和生產(chǎn)環(huán)境中的使用帶來方便。


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號