做ps的網(wǎng)站有哪些功能嗎蘭州seo公司
把時間用在思考上是最能節(jié)省時間的事情?!猍美]卡曾斯
導(dǎo)言
寫在前面
本文部分內(nèi)容引用的是Django官方文檔,對官方文檔進(jìn)行了解讀和理解,對官方文檔的部分注釋內(nèi)容進(jìn)行了翻譯,以方便大家的閱讀和理解。
概述
在上一篇文章里,我們學(xué)習(xí)了Django的數(shù)據(jù)庫以及拓展數(shù)據(jù)庫的使用以及設(shè)置項。這篇文章,我們開始學(xué)習(xí)Django的模型、API以及后臺管理系統(tǒng)的知識。
在 Django 里寫一個數(shù)據(jù)庫驅(qū)動的 Web 應(yīng)用的第一步是定義模型 - 也就是數(shù)據(jù)庫結(jié)構(gòu)設(shè)計和附加的其它元數(shù)據(jù)。關(guān)于API,進(jìn)入交互式 Python 命令行,嘗試一下 Django 為你創(chuàng)建的各種 API。
為你的員工或客戶生成一個用戶添加,修改和刪除內(nèi)容的后臺是一項缺乏創(chuàng)造性和乏味的工作。因此,Django 全自動地根據(jù)模型創(chuàng)建后臺界面。
Django 產(chǎn)生于一個公眾頁面和內(nèi)容發(fā)布者頁面完全分離的新聞類站點的開發(fā)過程中。站點管理人員使用管理系統(tǒng)來添加新聞、事件和體育時訊等,這些添加的內(nèi)容被顯示在公眾頁面上。Django 通過為站點管理人員創(chuàng)建統(tǒng)一的內(nèi)容編輯界面解決了這個問題。管理界面不是為了網(wǎng)站的訪問者,而是為管理者準(zhǔn)備的。
學(xué)習(xí)目標(biāo)
- 認(rèn)識和學(xué)習(xí)模型,并初步掌握腳本的編寫方法
- 學(xué)習(xí)模型的激活方法,以及運行數(shù)據(jù)遷移命令
- 了解并了解Django的API,了解常用的相關(guān)命令
- 初步認(rèn)識后臺管理系統(tǒng),創(chuàng)建Django后臺超級管理員以及后臺相關(guān)知識
模型
概述
一個模型就是單個定義你的數(shù)據(jù)的信息源。模型中包含了不可缺少的數(shù)據(jù)區(qū)域和你存儲數(shù)據(jù)的行為。在模型中,通過Python類進(jìn)行描述。
例如,我們現(xiàn)在需要創(chuàng)建兩個模型,那么就需要兩個Python類,問題 Question 和選項 Choice。Question 模型包括問題描述和發(fā)布時間。Choice 模型有兩個字段,選項描述和當(dāng)前得票數(shù)。每個選項屬于一個問題。
#導(dǎo)入models的包
from django.db import models
"""
定義Python的類,如下面的代碼的實例。
自定義的 Model 都必須繼承自 django.db.models.Model
"""class Question(models.Model):question_text = models.CharField(max_length=30)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)
模型繼承類型的介紹
Django Model 的繼承與 Python 類的繼承是一樣的,只是 Django 要求所有自定義的 Model 都必須繼承自 django.db.models.Model。在 Django 中 Model 之間有三種繼承模型,它們分別是抽象基類、多表繼承以及代理模型。
1. 抽象基類
抽象類繼承的作用是將子表中通用的字段聚合在一起,并將這些字段統(tǒng)一定義在抽象基類中,避免于重復(fù)定義這些字段。抽象基類的定義通過在模型的 Meta 中定義屬性 abstract=True 來實現(xiàn)。示例如下:
from django.db import modelsclass AbstractBase(models.Model):id = models.AutoField()content = models.CharField(max_length=100)username = models.CharField(max_length=80)nowday = models.DateTimeField()class Meta:abstract = Trueclass SomeThing(AbstractBase):testexams = models.CharField(max_length=50)class SomeComment(AbstractBase):level = models.CharField(max_length=20)
2. 多表繼承
這是 Django 支持的第二種繼承方式,因為每個類都是一個完整的 model,而不屬于抽象基類,所以父 model 和子 Model 都會有數(shù)據(jù)庫表,而且 Django 默認(rèn)會給和子表和父表之間自動創(chuàng)建一個 OneToOneField 數(shù)據(jù)表關(guān)系,并且該字段將作為子表的主鍵。示例如下:
from django.db import models
class a(A):
testname=models.charFiled(max_length=255,help_text="測試")
3. 代理模型
代理模型用來給父 Model 添加一些方法或者修改其 Meta 選項,但是父 Model 的字段定義不會被修改。我們可以理解為對原父 Model 進(jìn)行了 Copy,而被 Copy 出來的 Model 就叫做父 Model 的代理模型,但是這個代理模型又有其自己的特點,這相當(dāng)于 Python 面向?qū)ο笾械念惱^承與多態(tài)。
class BookExtend(Book):"""BOOK代理模型"""class Meta:ordering=['id'] #定義Meta選項順序排序按照id字段proxy=True #設(shè)置代理模型def __str__(self):return "title:%s pub:%s price:%s" % (self.title, self.pub, self.price) #定義方法
激活你的模型
將APP添加到Django的相關(guān)設(shè)置中
上面的一小段用于創(chuàng)建模型的代碼給了 Django 很多信息,通過這些信息,Django 可以:
- 為這個應(yīng)用創(chuàng)建數(shù)據(jù)庫 schema(生成 CREATE TABLE 語句)。
- 創(chuàng)建可以與 Question 和 Choice 對象進(jìn)行交互的 Python 數(shù)據(jù)庫 API。
但是首先得把 polls 應(yīng)用安裝到我們的項目里。
現(xiàn)在,我們要回到settings.py中,修改我們的代碼:
INSTALLED_APPS = ['django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles','polls.apps.PollsConfig',
]
數(shù)據(jù)庫的遷移操作
現(xiàn)在你的 Django 項目會包含 polls 應(yīng)用。接著在終端運行下面的命令:
py manage.py makemigrations polls
這條命令并不會直接執(zhí)行數(shù)據(jù)庫遷移的操作,而是會檢測你對模型文件的修改,并且把修改的部分儲存為一次 遷移。
現(xiàn)在,讓我們看看遷移命令會執(zhí)行哪些 SQL 語句。sqlmigrate 命令接收一個遷移的名稱,然后返回對應(yīng)的 SQL:
py manage.py sqlmigrate polls 0001
你將會看到下圖的輸出:
在官方文檔里,重組為我們能看懂的格式,如下:
BEGIN;
--
-- Create model Question
--
CREATE TABLE "polls_question" ("id" bigint NOT NULL PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY,"question_text" varchar(200) NOT NULL,"pub_date" timestamp with time zone NOT NULL
);
--
-- Create model Choice
--
CREATE TABLE "polls_choice" ("id" bigint NOT NULL PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY,"choice_text" varchar(200) NOT NULL,"votes" integer NOT NULL,"question_id" bigint 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;
現(xiàn)在,再次運行 migrate 命令,在數(shù)據(jù)庫里創(chuàng)建新定義的模型的數(shù)據(jù)表:
py manage.py migrate
此時,數(shù)據(jù)庫中多了兩張表,如下圖:
小結(jié)
現(xiàn)在,你只需要記住,改變模型需要這三步:
1、編輯 models.py 文件,改變模型。
2、運行 python manage.py makemigrations 為模型的改變生成遷移文件。
3、運行 python manage.py migrate 來應(yīng)用數(shù)據(jù)庫遷移。
學(xué)習(xí)至此,你可以去休息一下,或者消化或者練習(xí)一下以上的知識,更快地掌握,不至于很快地忘記你學(xué)的知識。掌握并熟練運用一種知識,終究是要勤加練習(xí)的,不能偷懶。
分界線以下的知識,本是下一篇文章的內(nèi)容,為了知識的連貫性,我將它們放在了一起,大家可以自由選擇是否學(xué)習(xí)或者將這里做一個分界線。
人之為學(xué),不日進(jìn)則日退?!櫻孜?/mark>
-------------------------------------------------分界線---------------------------------------------
初步認(rèn)識和使用API
首先,通過以下命令進(jìn)入交互行:
py manage.py shell
執(zhí)行這個命令的目的,并不是單單地想要使用python,而是我們需要根據(jù)settings.py設(shè)置 Python 包的導(dǎo)入路徑。并且,進(jìn)入到這個界面,就可以探索在命令行探索數(shù)據(jù)庫,即使你不懂?dāng)?shù)據(jù)庫相關(guān)的知識。怎么樣,是不是很貼心。
#請在shell交互行嘗試以下的命令探索
from polls.models import Choice, Question
#查詢表中所有的對象
Question.objects.all()
#輸出:<QuerySet []>
from django.utils import timezone
#使用命令向模型傳遞參數(shù)
q = Question(question_text="What's new?", pub_date=timezone.now())
#執(zhí)行保存命令后,Django會執(zhí)行SQL的插入語句
q.save()
#查看id
q.id
#輸出:1
#查看文本
q.question_text
#輸出:"What's new?"
#查看日期
q.pub_date
#輸出:datetime.datetime(2012, 2, 26, 13, 0, 0, 775217, tzinfo=datetime.timezone.utc)
#改變文本內(nèi)容
q.question_text = "What's up?"
#執(zhí)行保存后,Django會執(zhí)行修改操作
q.save()
#查看輸出
Question.objects.all()
#輸出:<QuerySet [<Question: Question object (1)>]>
講到這里,大家有沒有發(fā)現(xiàn)一個問題,貌似<QuerySet [<Question: Question object (1)>]>,這個東西對于我們來講,并沒有什么實質(zhì)性的幫助。它只能讓我們知道里面有東西,但具體是什么卻不知道,當(dāng)然,你完全可以去SQL命令行或者可視化軟件里面查看,但是我們今天討論的是Django的命令行。所以,現(xiàn)在我們要做的事情就是,修復(fù)這個問題。
現(xiàn)在讓我們會到models這個文件,給 Question 和 Choice 增加 str() 方法。
from django.db import modelsclass Question(models.Model):# ...def __str__(self):return self.question_textclass Choice(models.Model):# ...def __str__(self):return self.choice_text
給模型增加 str() 方法是很重要的,這不僅僅能給你在命令行里使用帶來方便,Django 自動生成的 admin 里也使用這個方法來表示對象。
讓我們再為此模型添加一個自定義方法,修改models中的代碼片段
import datetimefrom django.db import models
from django.utils import timezoneclass Question(models.Model):# ...def was_published_recently(self):return self.pub_date >= timezone.now() - datetime.timedelta(days=1)
保存這些更改并再次運行 python manage.py shell 以啟動新的 Python 交互式 shell:
重新運行shell命令行
添加str方法后的變化
from polls.models import Choice, Question
Question.objects.all()
#輸出:<QuerySet [<Question: What's up?>]>
使用ID查詢
Question.objects.filter(id=1)
#<QuerySet [<Question: What's up?>]>
使用關(guān)鍵字進(jìn)行模糊查詢
Question.objects.filter(question_text__startswith="What")
#<QuerySet [<Question: What's up?>]>
通過時間查詢對應(yīng)的對象信息
from django.utils import timezone
current_year = timezone.now().year
Question.objects.get(pub_date__year=current_year)
#<QuerySet [<Question: What's up?>]>
異常處理
我在操作這部分內(nèi)容的時候,出現(xiàn)了下面兩種錯誤
1、NameError: name ‘Question’ is not defined
解決方案:導(dǎo)入from polls.models import Choice, Question,導(dǎo)入對應(yīng)的參數(shù)
2、Django (2006, ‘MySQL server has gone away’)
解決方案:重新啟動服務(wù)器,一般都能解決。
3、執(zhí)行【Question.objects.get(id=2)】
解決方案:id不存在,創(chuàng)建該字段或者忽略該問題。
通過主鍵查詢
Question.objects.get(pk=1)
#<Question: What's up?>
確保自定義的方法是有效的
q = Question.objects.get(pk=1)
q.was_published_recently()
#輸出:True
處理models中的其它類
選項的查詢以及創(chuàng)建
現(xiàn)在我們要開始處理我們編寫的模型中的第二個Python類:選項。
#給這個問題幾個選項,對象,執(zhí)行INSERT語句,將選擇項添加到集合中
#查詢id=1的問題,并存儲在變量q中
q = Question.objects.get(pk=1)
#顯示相關(guān)對象集中的任何選項——到目前為止還沒有。
q.choice_set.all()
#輸出:<QuerySet []>
#創(chuàng)建3個選項
q.choice_set.create(choice_text="Not much", votes=0)
#<Choice: Not much>
q.choice_set.create(choice_text="The sky", votes=0)
#<Choice: The sky>
c = q.choice_set.create(choice_text="Just hacking again", votes=0)
#選擇對象可以通過API訪問其相關(guān)的問題對象。
#確認(rèn)一下選項對應(yīng)的問題
c.question
#<Question: What's up?>
q.choice_set.all()
#<QuerySet [<Choice: Not much>, <Choice: The sky>, <Choice: Just hacking again>]>
q.choice_set.count()
#輸出:3
#查詢
Choice.objects.filter(question__pub_date__year=current_year)
#<QuerySet [<Choice: Not much>, <Choice: The sky>, <Choice: Just hacking again>]>
刪除選項的操作
#查詢出來需要刪除的選項,并存儲在變量中
c = q.choice_set.filter(choice_text__startswith="Just hacking")
#執(zhí)行刪除操作
c.delete()
小結(jié)
寫到這里,有關(guān)Django提供的API操作就暫時討論到這里啦。是不是很便捷,這就是Django的強(qiáng)大指出之一。下面讓我們一起走進(jìn)Django的后臺管理系統(tǒng),為我們更加便捷的開發(fā)工作提供便利。
Django 管理頁面
概述
為你的員工或客戶生成一個用戶添加,修改和刪除內(nèi)容的后臺是一項缺乏創(chuàng)造性和乏味的工作。因此,Django 全自動地根據(jù)模型創(chuàng)建后臺界面。
Django 產(chǎn)生于一個公眾頁面和內(nèi)容發(fā)布者頁面完全分離的新聞類站點的開發(fā)過程中。站點管理人員使用管理系統(tǒng)來添加新聞、事件和體育時訊等,這些添加的內(nèi)容被顯示在公眾頁面上。Django 通過為站點管理人員創(chuàng)建統(tǒng)一的內(nèi)容編輯界面解決了這個問題。
管理界面不是為了網(wǎng)站的訪問者,而是為管理者準(zhǔn)備的。
管理頁面的配置
創(chuàng)建超級管理員登錄賬號
要創(chuàng)建登錄賬號,請執(zhí)行以下命令:
py manage.py createsuperuser
接著,根據(jù)提示創(chuàng)建用戶名、電子郵件、密碼、確認(rèn)密碼,如下圖
由于我們創(chuàng)建的是超級管理員,所以所有的警示信息都可以忽略,直接選擇y(是),直接執(zhí)行即可。電子郵件如果不輸入直接回車跳過即可。
管理頁面
啟動開發(fā)服務(wù)器
Django 的管理界面默認(rèn)就是啟用的。讓我們啟動開發(fā)服務(wù)器,看看它到底是什么樣的。如果開發(fā)服務(wù)器未啟動,用以下命令啟動它:
py manage.py runserver
訪問管理頁面并登錄
1、請訪問你的后臺管理地址,例如:http://127.0.0.1:8888/admin/。
2、輸入用戶名和密碼進(jìn)入后臺管理界面,例如admin/123456
向管理頁面中加入投票應(yīng)用
但是我們的投票應(yīng)用在哪呢?它沒在索引頁面里顯示。只需要再做一件事:我們得告訴管理,問題 Question 對象需要一個后臺接口。打開 polls/admin.py 文件,把它編輯成下面這樣:
from django.contrib import admin
from .models import Question
admin.site.register(Question)
體驗便捷的管理功能
現(xiàn)在我們向管理頁面注冊了問題 Question 類。Django 知道它應(yīng)該被顯示在索引頁里:
點擊 “Questions” ?,F(xiàn)在看到是問題 “Questions” 對象的列表 “change list” 。這個界面會顯示所有數(shù)據(jù)庫里的問題 Question 對象,你可以選擇一個來修改。這里現(xiàn)在有我們在上一部分中創(chuàng)建的 “What’s up?” 問題。
點擊 “What’s up?” 來編輯這個問題(Question)對象:
變更歷史
點擊右上角的歷史,之后頁面如下圖所示:
你會看到一個列出了所有通過 Django 管理頁面對當(dāng)前對象進(jìn)行的改變的頁面,其中列出了時間戳和進(jìn)行修改操作的用戶名:
總結(jié)
本文將兩個課時的內(nèi)容合為一篇長文章,詳盡地討論了API、模型以及后臺管理系統(tǒng)。希望大家可以慢慢消化,認(rèn)真閱讀,有所收獲。
下一篇文章,我們將繼續(xù)深入Django,除了模型,下一篇文章我們將詳盡地講述Django的視圖,請大家繼續(xù)期待。
這一篇文章至此,已經(jīng)寫到末尾,感謝你的閱讀和支持,如果允許,請點個贊或使用打賞功能進(jìn)行鼓勵。你的打賞將是我持續(xù)更新的動力。
下一篇文章,再見!
人生就象弈棋, 一步失誤, 全盤皆輸,這是令人悲哀之事;而且人生還不如弈棋,不可能再來一局,也不能悔棋。—— 弗洛伊德