前一部分,我们已经成功创建了博客项目,是时候正是施工了...
这一部分的主要内容:
· 了解Django的开发模式
· 配置数据库
· 创建你的博客APP
· 创建模型
一、Django的MVC模式/MTV模式(摘自《The Django Book》):
Django紧紧地遵循MVC模式,可以称得上是一种MVC框架。 以下是Django中M、V和C各自的含义:
· M:数据存取部分,由django数据库层处理;
· V:选择显示哪些数据要显示以及怎样显示的部分,由视图和模板处理;
· C:根据用户输入委派视图的部分,由Django框架根据URLconf设置,对给定URL调用适当的Python函数。
由于C由框架自行处理,而Django里更关注的是模型(Model)、模板(Template)和视图(Views),Django也被称为MTV框架。在MTV开发模式中:
· M代表模型(Model):即数据存取层。该层处理与数据相关的所有事务:如何存取、如何验证有效性、包含哪些行为以及数据之间的关系等;
· T代表模板(Template):即表现层。该层处理与表现相关的决定:如何在页面或其他类型文档中进行显示。
· V代表视图(View),即业务逻辑层。该层包含存取模型及调取恰当模板的相关逻辑。你可以把它看作模型与模板之间的桥梁。
二、配置数据库和创建新的APP:
之前我们已经知道,Django的MTV开发模式中M代表模型(Model),即处理与数据相关的所有事务,存储数据必然要用到数据库,所以第一步,我们需要对此进行配置。
在之前创建项目时,Django为我们生成了一个setting.py文件,打开它并找到如下行:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
'NAME': '', # Or path to database file if using sqlite3.
'USER': '', # Not used with sqlite3.
'PASSWORD': '', # Not used with sqlite3.
'HOST': '', # Set to empty string for localhost. Not used with sqlite3.
'PORT': '', # Set to empty string for default. Not used with sqlite3.
}
}
Django支持很多种数据库,如MySQL、PostgreSQL、Oracle、SQLite3等。这里为了方便选用SQLite3,它是一款开源、嵌入式关系型数据库。我使用的是Python 2.6,其内置了sqlite3模块,可以很方便地使用。对之前的settings.py做如下修改:
'ENGINE': 'django.db.backends.sqlite3'
'NAME': 修改为你的数据库文件的路径
保存配置,返回到项目根目录下,运行 python manage.py shell,执行如下命令:
>>> from django.db import connection
>>> cursor = connection.cursor()
这里,请确保你设置的数据库文件的目录已经的的确确存在了。如果运行以上命令没有出错的话,表明你的数据库配置是正确的。
接下来我们创建一个应用并将其命名为blog:
[danny@localhost dblog]$ python manage.py startapp blog
执行完成后可以发现目录下多出一个文件夹,这个目录里包含了这个app的模型和视图:
[danny@localhost blog]$ ls -l
total 12
-rw-r--r--. 1 danny danny 0 Nov 2 20:50 __init__.py
-rw-r--r--. 1 danny danny 57 Nov 2 20:50 models.py
-rw-r--r--. 1 danny danny 383 Nov 2 20:50 tests.py
-rw-r--r--. 1 danny danny 26 Nov 2 20:50 views.py
再次编辑settings.py,在INSTALLED_APPS里添加你的应用名称,即“blog”:
INSTALLED_APPS = (
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'django.contrib.messages',
'django.contrib.staticfiles',
'blog',
)
三、创建模型:
一切的准备工作都已就绪,现在就该正式开始规划怎么存储博客的数据了,即模型的定义。
Django模型是用Python代码形式表述的数据在数据库中的定义。对数据层来说它等同于CREATE TABLE语句,只不过执行的是Python代码而不是SQL,而且还包含了比数据库字段定义更多的含义。Django用模型在后台执行SQL代码并把结果用Python的数据结构来描述。
回到我们的博客上,一个博客包含标题、作者、发表的时间、分类、标签等内容;而作者肯定有姓名和一些基本的联系方式;分类和标签则可以简单一些,只需要名字就足够了......
下面我们就来描述它:打开刚才创建的blog应用的models.py文件,并输入如下内容:
from django.db import models
class Tag(models.Model):
tag_name = models.CharField(max_length=20)
create_time = models.DateTimeField(auto_now_add=True)
def __unicode__(self):
return self.tag_name
class Classification(models.Model):
name = models.CharField(max_length=20)
def __unicode__(self):
return self.name
class Author(models.Model):
name = models.CharField(max_length=30)
email = models.EmailField(blank=True)
website = models.URLField(blank=True)
def __unicode__(self):
return u'%s' % (self.name)
class Article(models.Model):
caption = models.CharField(max_length=30)
subcaption = models.CharField(max_length=50, blank=True)
publish_time = models.DateTimeField(auto_now_add=True)
update_time = models.DateTimeField(auto_now=True)
author = models.ForeignKey(Author)
classification = models.ForeignKey(Classification)
tags = models.ManyToManyField(Tag, blank=True)
content = models.TextField()
这里,每个模型相当于单个数据库表,而每个属性也就是这个表中的一个字段。每个数据模型都是 django.db.models.Model 的子类,它的父类 Model 包含了所有必要的和数据库交互的方法。其它的知识点这里就不说了,如果需要进一步了解,可以参考Django的官方文档。
保存并关闭,返回项目根目录下,执行 python manage.py validate,如果返回“0 errors found”,说明你的模型的语法和逻辑都正确。再执行 python manage.py sqlall blog,可以得到如下输出:
BEGIN;
CREATE TABLE "blog_tag" (
"id" integer NOT NULL PRIMARY KEY,
"tag_name" varchar(20) NOT NULL,
"create_time" datetime NOT NULL
)
;
CREATE TABLE "blog_classification" (
"id" integer NOT NULL PRIMARY KEY,
"name" varchar(20) NOT NULL
)
;
CREATE TABLE "blog_author" (
"id" integer NOT NULL PRIMARY KEY,
"name" varchar(30) NOT NULL,
"email" varchar(75) NOT NULL,
"website" varchar(200) NOT NULL
)
;
CREATE TABLE "blog_article_tags" (
"id" integer NOT NULL PRIMARY KEY,
"article_id" integer NOT NULL,
"tag_id" integer NOT NULL REFERENCES "blog_tag" ("id"),
UNIQUE ("article_id", "tag_id")
)
;
CREATE TABLE "blog_article" (
"id" integer NOT NULL PRIMARY KEY,
"caption" varchar(30) NOT NULL,
"subcaption" varchar(50) NOT NULL,
"publish_time" datetime NOT NULL,
"update_time" datetime NOT NULL,
"author_id" integer NOT NULL REFERENCES "blog_author" ("id"),
"classification_id" integer NOT NULL REFERENCES "blog_classification" ("id"),
"content" text NOT NULL
)
;
CREATE INDEX "blog_article_cc846901" ON "blog_article" ("author_id");
CREATE INDEX "blog_article_337f0fda" ON "blog_article" ("classification_id");
COMMIT;
很明显,你的模型已经变成了SQL语句,确认无误后,最后执行python manage.py syncdb即可将创建的模型同步至数据库。这里系统可能会提示你添加一个超级用户,按步骤添加即可,这个用户可以用于在之后登录Django的站点管理。
这一部分内容就到这里,如需系统学习,可以参考《The Django Book》第五章。