BLOG
Enjoy when you can, and endure when you must.
NOV 02, 2012/Django
Django个人博客开发(二)

本文已历史长远,建议阅读最新的《用 Django 构建简易博客》系列文章

 

前一部分,我们已经成功创建了博客项目,是时候正是施工了...

这一部分的主要内容:

· 了解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》第五章。

COMMENTS
LEAVE COMMNT