接上一篇Python3.0 Django2.0.4 搭建項目(一)記錄,這一篇主要記錄我們將建立數(shù)據(jù)庫庙楚,創(chuàng)建第一個模型很魂,還有 Django 提供的自動生成的admin管理頁面。
數(shù)據(jù)庫配置
打開 mysite/settings.py文件咏瑟,里面有一個INSTALLED_APPS拂到,我們可以了解一下這里面Django 的自帶應用
django.contrib.admin -- 管理員站點, 你很快就會使用它码泞。
django.contrib.auth -- 認證授權(quán)系統(tǒng)兄旬。
django.contrib.contenttypes -- 內(nèi)容類型框架。
django.contrib.sessions -- 會話框架余寥。
django.contrib.messages -- 消息框架领铐。
django.contrib.staticfiles -- 管理靜態(tài)文件的框架。
這些應用被默認啟用是為了給常規(guī)項目開發(fā)提供方便宋舷。
在上一篇中我們有提到一個數(shù)據(jù)庫的問題绪撵,這是默認開啟的某些應用需要至少一個數(shù)據(jù)表,所以祝蝠,在使用他們之前需要在數(shù)據(jù)庫中創(chuàng)建一些表音诈⌒诶矗可以使用一下命令:
python manage.py migrate
創(chuàng)建模型
在 polls/models.py 文件添加代碼:
from django.db import models
class Question(models.Model):
question_text = models.CharField(max_length=200)
pub_date = models.DateTimeField('date published')
class Choice(models.Model):
question = models.ForeignKey(Question, on_delete=models.CASCADE)
choice_text = models.CharField(max_length=200)
votes = models.IntegerField(default=0)
這段代碼主要創(chuàng)建兩個模型,每個模型被表示為 django.db.models.Model 類的子類改艇。每個模型有一些類變量收班,它們都表示模型里的一個數(shù)據(jù)庫字段。
每個字段都是 Field 類的實例谒兄,比如摔桦,字符字段被表示為CharField,期時間字段被表示為 DateTimeField承疲。
每個 Field 類實例變量的名字(例如 question_text 或 pub_date )也是字段名邻耕,我們會在在 Python 代碼里使用它們,而數(shù)據(jù)庫會將它們作為列名燕鸽。
定義Field類需要參數(shù)兄世。例如 CharField 需要一個 max_length 參數(shù)。這個參數(shù)的用處不止于用來定義數(shù)據(jù)庫結(jié)構(gòu)啊研,也用于驗證數(shù)據(jù)御滩。
Field 也能夠接收多個可選參數(shù);在上面的例子中:我們將 votes 的 default 也就是默認值党远,設為0削解。
最后,我們使用 ForeignKey 定義了一個關系沟娱。這將告訴 Django氛驮,每個 Choice 對象都關聯(lián)到一個 Question 對象。Django 支持所有常用的數(shù)據(jù)庫關系:多對一济似、多對多和一對一矫废。
激活模型
通過上面創(chuàng)建模型,Django可以幫我們做一下幾個事情:
1.為應用創(chuàng)建數(shù)據(jù)庫 chemea(生成 CREATE TABLE 語句)砰蠢。
2.創(chuàng)建可以與 Question 和 Choice 對象進行交互的 Python 數(shù)據(jù)庫 API蓖扑。
但是前提是我們得先把polls應用安裝到我們的項目里面。
可以在INSTALLED_APPS里面加上'polls'或者'polls.apps.PollsConfig'
INSTALLED_APPS = [
'polls.apps.PollsConfig',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
經(jīng)過上面的操作我們已經(jīng)注冊polls這個應用了娩脾,因為我們之前對模型做了一些改變赵誓,并且你想要把這些改變保存為 migration。接著運行下面的命令:
python manage.py makemigrations polls
可以看到以下輸出:
這個命令是什么意思柿赊,做了什么操作呢俩功?我們可以通過一下命令查看
python manage.py sqlmigrate polls 0001
以下就是通過這個命令輸出的log
BEGIN;
--
-- Create model Choice
--
CREATE TABLE "polls_choice" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "choice_text" varchar(200) NOT NULL, "votes" integer NOT NULL);
--
-- Create model Question
--
CREATE TABLE "polls_question" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "question_text" varchar(200) NOT NULL, "pub_date" datetime NOT NULL);
--
-- Add field question to choice
--
ALTER TABLE "polls_choice" RENAME TO "polls_choice__old";
CREATE TABLE "polls_choice" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "choice_text" varchar(200) NOT NULL, "votes" integer NOT NULL, "question_id" integer NOT NULL REFERENCES "polls_question" ("id") DEFERRABLE INITIALLY DEFERRED);
INSERT INTO "polls_choice" ("id", "choice_text", "votes", "question_id") SELECT "id", "choice_text", "votes", NULL FROM "polls_choice__old";
DROP TABLE "polls_choice__old";
CREATE INDEX "polls_choice_question_id_c5b4b260" ON "polls_choice" ("question_id");
COMMIT;
從上面可以看出來,是執(zhí)行了創(chuàng)建數(shù)據(jù)庫表的命令碰声。
以上有幾點需要注意:
1.數(shù)據(jù)庫的表名是由應用名(polls)和模型名的小寫形式( question 和 choice)連接而來诡蜓。例如polls_question和polls_choice
2.主鍵(IDs)會被自動創(chuàng)建
3.Django默認會在外鍵字段名后追加字符串 "_id"
4.外鍵關系由 FOREIGN KEY 生成
5.生成的 SQL 語句是為你所用的數(shù)據(jù)庫定制的,所以那些和數(shù)據(jù)庫有關的字段類型胰挑,比如 auto_increment (MySQL)蔓罚、 serial (PostgreSQL)和 integer primary key autoincrement (SQLite)椿肩,Django 會幫你自動處理。那些和引號相關的事情 - 例如豺谈,是使用單引號還是雙引號 - 也一樣會被自動處理郑象。
6.這個 sqlmigrate 命令并沒有真正在你的數(shù)據(jù)庫中的執(zhí)行遷移 - 它只是把命令輸出到屏幕上,讓你看看 Django 認為需要執(zhí)行哪些 SQL 語句
再次執(zhí)行 migrate 命令茬末,在數(shù)據(jù)庫里創(chuàng)建新定義的模型的數(shù)據(jù)表
python manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, contenttypes, polls, sessions
Running migrations:
Applying polls.0001_initial... OK
綜上可以總結(jié)一下數(shù)據(jù)庫創(chuàng)建遷移大概需要三個步驟:
1.編輯 models.py 文件厂榛,改變模型。
2.運行 python manage.py makemigrations 為模型的改變生成遷移文件丽惭。
3.運行 python manage.py migrate 來應用數(shù)據(jù)庫遷移击奶。
數(shù)據(jù)庫操作
首先我們在終端輸入命令python manage.py shell,然后關聯(lián)我們剛才創(chuàng)建的數(shù)據(jù)庫表
操作數(shù)據(jù)庫一般就是增刪改查這些操作
增
obj = Question(question_text="What's new?", pub_date=timezone.now())
q.save()
刪
q = Question.objects.get(pk=1)
c = q.choice_set.filter(choice_text__startswith='Just hacking')
c.delete()
改
q = Question.objects.get(pk=1)
q.question_text = "How old are you?"
q.save()
查
1.Question.objects.all() 獲取全部數(shù)據(jù)
2.Question.objects.filter(question_text__startswith='What') 獲取question_text以'What'開始的數(shù)據(jù)
3.Question.objects.exclude(question_text__startswith='What') 獲取除了question_text以'What'開始的數(shù)據(jù)
4.Question.objects.get(id=1) 獲取id=1的單條數(shù)據(jù),不存在則報錯(不建議)
這里涉及到我們對models.py的一些修改责掏,如下
class Question(models.Model):
question_text = models.CharField(max_length=200)
pub_date = models.DateTimeField('date published')
def __str__(self):
return self.question_text
def was_published_recently(self):
return self.pub_date >= timezone.now() - datetime.timedelta(days=1)
class Choice(models.Model):
question = models.ForeignKey(Question, on_delete=models.CASCADE)
choice_text = models.CharField(max_length=200)
votes = models.IntegerField(default=0)
def __str__(self):
return self.choice_text
介紹 Django 管理頁面
首先柜砾,我們需要創(chuàng)建一個能登錄管理頁面的用戶。運行下面的命令:
python manage.py createsuperuser
根據(jù)提示輸入用戶名换衬,郵箱和密碼就可以創(chuàng)建好賬號了痰驱,效果如下圖
接下來在瀏覽器中輸入http://127.0.0.1:8000/admin/,你就會看見管理員登錄界面冗疮,通過剛才創(chuàng)建的賬號登錄萄唇,可以看到進入了管理界面,如圖
向管理頁面中加入我們創(chuàng)建的應用
在polls/admin.py里面添加需要放到我們管理頁面的功能术幔,修改polls/admin.py文件
from django.contrib import admin
from .models import Question
admin.site.register(Question)
刷新一下頁面,可以看到Question已經(jīng)在我們的管理列表里面了
點擊Question就可以就可以看到對應的管理列表了湃密,可以通過點擊“What's up”來編輯這個選項
注意事項:
1.這個表單是從 Question 模型中自動生成的
2.不同的字段類型(日期時間字段 DateTimeField 诅挑、字符字段 CharField)會生成對應的 HTML 輸入控件。
3.每個日期時間字段 DateTimeField 都有 JavaScript泛源,可以直接選擇日期
頁面功能:
1.保存(Save) - 保存改變拔妥,然后返回對象列表。
2.保存并繼續(xù)編輯(Save and continue editing) - 保存改變达箍,然后重新載入當前對象的修改界面没龙。
3.保存并新增(Save and add another) - 保存改變,然后添加一個新的空對象并載入修改界面缎玫。
4.刪除(Delete) - 顯示一個確認刪除頁面硬纤。
接下來就可以在編輯界面做相應的增刪改查操作了。