http://www.dannysite.com/blog/7/
前一部分,我们已经成功创建了博客项目,是时候正是施工了...
这一部分的主要内容:
· 了解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文件,并输入如下内容:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
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,可以得到如下输出:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
|
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》第五章。