Django4.0 激活模型

2022-03-12 10:34 更新

Django 可以:

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

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

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

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

現在你的 Django 項目會包含 ?polls應用。接著運行下面的命令:

...\> py manage.py makemigrations polls

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

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

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

請注意以下幾點:

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

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

...\> 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 通過在數據庫中創(chuàng)建一個特殊的表 ?django_migrations? 來跟蹤執(zhí)行過哪些遷移)并應用在數據庫上 - 也就是將你對模型的更改同步到數據庫結構上。

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

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

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

運行 ?python manage.py migrate? 來應用數據庫遷移。

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


以上內容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號