提到數據模型,一定要說一下MVC,MVC框架是現代web開發中最流行的開發框架,它將數據與業務邏輯分開,減小了應用之間的高度耦合。個人非常喜歡MVC開發框架,除了具有上述特性,它使得web開發變得非常靈活,在asp.net上表現的尤為強烈,傳統的ASP.NET開發常常用到好多臃腫的服務器端控件,定制起來非常麻煩而且具有局限性。近年來,MVC遍地開發,在java、php、ruby、.NET,甚至javascript中都有對應的MVC框架,當然了,django也是其中之一。
數據模型作為MVC的一部分,用于封裝與應用程序的業務邏輯相關的數據以及對數據的處理方法,并且對數據直接訪問的權力,而且不關心具體的業務邏輯。
今天,接著上一篇django開發個人簡易Blog——構建項目結構,以本系統為例,說一下django中數據模型的設計及操作。
本系統采用MySQL作為數據庫存儲。所以首先要保證安裝了mysql,然后安裝MySQLdb模塊,可到這里下載相對應的windows或者linux目前的最新版本并安裝,之后在命令窗口中輸入 :
pythonimport MySQLdb
如果沒有顯示錯誤,則表示安裝成功。
開啟django自帶的后臺管理功能:
其實,django自帶了一套功能完整可用的后臺管理系統,是django.contrib包的一部分,并且可以靈活擴展我們增加的新的app功能。只需要運行幾個簡單的命令,就可以方便的將數據模型和mysql數據庫建立聯系。首先打開我們創建的項目中的settings.py文件,看到里面默認的配置中有這樣的配置:
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的安裝目錄下找到。
因為要與mysql進行數據交互,所以首先要配置mysql的連接信息,類似于.NET中的連接字符串。配置信息在settings.py文件中,配置格式如下:
#windows版:DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', #標識數據庫引擎類型 也可以使postgresql、sqlite3、Oracle 'NAME':"mypythonblog", #數據庫名稱 'USER': 'xxxxxx', # 用戶名 如果是sqlite3可以為空 'PASSWord': 'xxxxxxxxxx', # 密碼 如果是sqlite3可以為空 'HOST': 'localhost', # 服務器 'PORT': '', # 端口 默認端口可以為空 mysql默認端口為3306 }}#linux版 CentOS6.5DATABASES = { '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 shell
輸入如下代碼:
from django.db import connectioncursor = 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` FOREIGN KEY (`author_id`) REFERENCES `auth_user` (`id`);ALTER TABLE `blogapp_fz_article` ADD CONSTRAINT `classic_id_refs_id_992b177f` FOREIGN 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 adminfrom 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自帶的后臺管理功能。到這里基本功能都是可用的,包括管理用戶、用戶組、管理文章、分類、評論都可以通過自帶的后臺管理界面來完成,當然了,能用并不代表好用,后面我會介紹怎么樣開發自己的后臺管理功能,以及如何展示。
新聞熱點
疑難解答