提到數據模型,必定要說一下MVC,MVC框架是現代web開發中最流行的開發框架,它將數據與業務邏輯分開,減少了應用之間的高度耦合。我的很是喜歡MVC開發框架,除了具備上述特性,它使得web開發變得很是靈活,在ASP.NET上表現的尤其強烈,傳統的ASP.NET開發經常用到好多臃腫的服務器端控件,定製起來很是麻煩並且具備侷限性。近年來,MVC遍地開發,在java、php、ruby、.NET,甚至javascript中都有對應的MVC框架,固然了,django也是其中之一。javascript
數據模型做爲MVC的一部分,用於封裝與應用程序的業務邏輯相關的數據以及對數據的處理方法,而且對數據直接訪問的權力,並且不關心具體的業務邏輯。php
今天,接着上一篇django開發我的簡易Blog——構建項目結構,以本系統爲例,說一下django中數據模型的設計及操做。html
本系統採用mysql做爲數據庫存儲。因此首先要保證安裝了mysql,而後安裝MySQLdb模塊,可到這裏下載相對應的windows或者linux目前的最新版本並安裝,以後在命令窗口中輸入 :java
python import MySQLdb
若是沒有顯示錯誤,則表示安裝成功。python
開啓django自帶的後臺管理功能:mysql
其實,django自帶了一套功能完整可用的後臺管理系統,是django.contrib包的一部分,而且能夠靈活擴展咱們增長的新的app功能。只須要運行幾個簡單的命令,就能夠方便的將數據模型和mysql數據庫創建聯繫。首先打開咱們建立的項目中的settings.py文件,看到裏面默認的配置中有這樣的配置:linux
INSTALLED_APPS = ( 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', )
每個app都有本身的數據模型,例如上一篇中咱們建立的blogapp,其目錄下有models.py這個文件,就是用來定義數據模型的,而django自帶的app,咱們也能夠在django的安裝目錄下找到。web
由於要與mysql進行數據交互,因此首先要配置mysql的鏈接信息,相似於.NET中的鏈接字符串。配置信息在settings.py文件中,配置格式以下:sql
#windows版: DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', #標識數據庫引擎類型 也可使postgresql、sqlite三、oracle 'NAME':"mypythonblog", #數據庫名稱 'USER': 'xxxxxx', # 用戶名 若是是sqlite3能夠爲空 'PASSWORD': 'xxxxxxxxxx', # 密碼 若是是sqlite3能夠爲空 'HOST': 'localhost', # 服務器 'PORT': '', # 端口 默認端口能夠爲空 mysql默認端口爲3306 } } #linux版 CentOS6.5 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME':"mypythonblog", 'USER': 'root', # 用戶名. 'PASSWORD': 'xxxxxxx', # 密碼 'HOST': '/var/lib/mysql/mysql.sock', # mysql會經過Unix socket 來鏈接指定的套接字 'PORT': '', } }
進入這個項目的根目錄,運行以下命令,啓動交互解釋器:python manage.py shellshell
輸入以下代碼:
from django.db import connection cursor = connection.cursor()
若是沒有出現錯誤,則說明數據庫配置正常,不然,會提示具體的錯誤信息。
接下來到了相當重要的一步,將django自帶的數據模型同步到數據庫,這個過程當中django會根據INSTALLED_APPS下設置的app,校驗其正確性,並將模型同步到數據庫,生成對應的表結構,要經過如下命令完成,進入項目根目錄,也就是manage.py所在的目錄:
python manage.py syncdb
運行命令後,出現以下內容:
從圖中能夠看出建立了9個數據表,而且提示是否爲系統建立一個超級管理員,爲了之後登陸系統,咱們輸入yes。
以後按照提示輸入用戶名及密碼便可。
若是一切順利,說明數據模型已經同步至數據庫中,咱們打開urls.py文件,查看其中是否有url(r'^admin/', include(admin.site.urls)),路由設置,而且保證未被註釋。
最後,用python manage.py runserver 1989命令,在1989端口啓動網站,固然也能夠輸入其它端口,或者不輸入端口,即便用默認端口。打開瀏覽器,在瀏覽器中訪問http://127.0.0.1:1989/admin ,出現以下登陸界面:
輸入剛剛建立的超級用戶的用戶名和密碼,點擊login按鈕,即來到以下的管理界面:
經過這個管理界面,能夠方便的對用戶組和用戶進行管理,而且有詳細的日誌記錄。
到目前爲止,一個能夠驗證用戶權限而且可管理用戶組和用戶的後臺管理系統就能夠完美的運行了,簡直太方便了。好了,下面開始添加與本系統相關的數據模型。
數據模型設計:
因爲這只是一個簡單的博客,而且功能有限,因此,數據模型也是比較簡單的,僅包括文章表、分類表及評論表這三個表,至於用戶驗證的部分,使用django自帶的用戶表。
咱們建立的blogapp中,有一個models.py的文件,模型的定義就在這個文件裏,每個數據模型對應一個類,只要這個類繼承自models.Model。
「文章」模型定義,定義代碼以下:
class fz_Article(models.Model): title = models.CharField(max_length=56,verbose_name='標題') content = models.TextField(verbose_name='文章內容') author = models.ForeignKey(User) #User是django自帶的用戶模型定義 要首先引入 from django.contrib.auth.models import User tags = models.CharField(max_length=1023,verbose_name='標籤',blank=True) classic = models.ForeignKey(fz_classic) publish_date = models.DateTimeField() ispublished = models.BooleanField() commentcount = models.IntegerField(blank=True) readcount = models.IntegerField(blank=True)
「分類」模型定義,代碼以下:
class fz_classic(models.Model): name = models.CharField(max_length=56) articecount = models.IntegerField() def __unicode__(self): return self.name
「評論」模型定義,代碼以下:
class fz_comment(models.Model): article = models.ForeignKey(fz_Article) comment_content = models.TextField() comment_date = models.DateField() email = models.EmailField() commentator = models.TextField()
模型的定義規則是什麼,怎麼定義,這些我就不說了,也不必說,找一本書或者讀幾篇文章也就明白了。
開始安裝自定義的模型,找到settings.py,將INSTALLED_APPS中設置的值,增長一項'fengzhengBlog.blogapp',包名是fengzhengBlog,app名稱是blogapp>
執行以下命令,檢查模型定義的正確性:python manage.py validate,若是正確則會提示:0 errors found。
執行以下命令,生成模型所對應的sql語句:python manage.py sqlall blogapp。生成的sql以下:
BEGIN; CREATE TABLE `blogapp_fz_classic` ( `id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY, `name` varchar(56) NOT NULL, `articecount` integer NOT NULL ) ; CREATE TABLE `blogapp_fz_article` ( `id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY, `title` varchar(56) NOT NULL, `content` longtext NOT NULL, `author_id` integer NOT NULL, `tags` varchar(1023) NOT NULL, `classic_id` integer NOT NULL, `publish_date` datetime NOT NULL, `ispublished` bool NOT NULL, `commentcount` integer NOT NULL, `readcount` integer NOT NULL ) ; ALTER TABLE `blogapp_fz_article` ADD CONSTRAINT `author_id_refs_id_a7f24472` FOR EIGN KEY (`author_id`) REFERENCES `auth_user` (`id`); ALTER TABLE `blogapp_fz_article` ADD CONSTRAINT `classic_id_refs_id_992b177f` FO REIGN KEY (`classic_id`) REFERENCES `blogapp_fz_classic` (`id`); CREATE TABLE `blogapp_fz_comment` ( `id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY, `article_id_id` integer NOT NULL, `comment_content` longtext NOT NULL, `comment_date` date NOT NULL ) ; ALTER TABLE `blogapp_fz_comment` ADD CONSTRAINT `article_id_id_refs_id_cbb24377` FOREIGN KEY (`article_id_id`) REFERENCES `blogapp_fz_article` (`id`); CREATE INDEX `blogapp_fz_article_e969df21` ON `blogapp_fz_article` (`author_id`) ; CREATE INDEX `blogapp_fz_article_3da92ebb` ON `blogapp_fz_article` (`classic_id` ); CREATE INDEX `blogapp_fz_comment_0f1c6027` ON `blogapp_fz_comment` (`article_id_ id`); COMMIT;
腳本中包括建立表結構,而且包括主外鍵的依賴關係,而且能夠看到要生成的數據表被重命名成了「app名稱_模型名稱」。這個命令只是生成了sql,並無在數據庫中執行,要執行同步,還須要執行下面的命令:python manage.py syncdb。上面已經執行過一遍這個命令,再次執行,會將INSTALLED_APPS下,未同步至數據庫的模型同步至數據庫,已經在數據庫中同步過的不作同步,即便,字段有修改,也不予同步。同步成功後,打開sql會發現裏面已經出現了上面的模型所對應的表結構。
若是未同步過去,而且沒有出現錯誤,多是由於blogapp下存在migrations文件夾,刪除後,再次執行命令便可。
接下來,啓動網站,訪問http://127.0.0.1:1989/admin/ 輸入用戶名和密碼,進入管理頁面,咦,什麼狀況,說好的安裝什麼app就會出現對應的管理功能呢,怎麼依然只有Auth這個app的管理功能區。不用着急,blogapp目錄下還有一個admin.py的文件,存在即有它存在的道理,它的做用就是註冊這個app到後臺管理中,而且還能夠在這裏設置一些與後臺管理功能相關的功能,例如排序字段、可搜索字段等。複雜功能我都不要,只要最基本的就能夠,打開admin.py,在其中加入以下代碼:
from django.contrib import admin from fengzhengBlog.blogapp.models import * #導入模型定義 # Register your models here. #註冊模型到後臺管理界面 admin.site.register(fz_Article) admin.site.register(fz_comment) admin.site.register(fz_classic)
保存後,刷新頁面,出來了,Auth下面多出了Blogapp,能夠對文章、類別、評論進行管理了。英文的界面,看着不太爽啊,找到settings.py中的LANGUAGE_CODE = 'en-us'改成LANGUAGE_CODE = 'zh-CN',再刷新一看看吧。
最後生成的表結構以下:
blogapp_fz_article
blogapp_fz_classic:
blogapp_fz_comment:
以上就是經過定義數據模型,並經過命令同步至數據庫,而後激活django自帶的後臺管理功能。到這裏基本功能都是可用的,包括管理用戶、用戶組、管理文章、分類、評論均可以經過自帶的後臺管理界面來完成,固然了,能用並不表明好用,後面我會介紹怎麼樣開發本身的後臺管理功能,以及如何展現。