提到数据模型,一定要说一下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目前的最新版本并安装,之后在命令窗口中输入 :

python
import 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.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 shell

输入如下代码:

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自带的后台管理功能。到这里基本功能都是可用的,包括管理用户、用户组、管理文章、分类、评论都可以通过自带的后台管理界面来完成,当然了,能用并不代表好用,后面我会介绍怎么样开发自己的后台管理功能,以及如何展示。

django开发个人简易Blog——数据模型的更多相关文章

  1. django开发个人简易Blog—nginx+uwsgin+django1.6+mysql 部署到CentOS6.5

    前面说完了此项目的创建及数据模型设计的过程.如果未看过,可以到这里查看,并且项目源码已经放大到github上,可以去这里下载. 代码也已经部署到sina sea上,地址为http://fengzhen ...

  2. django开发个人简易Blog——构建项目结构

    开发之前第一步,就是构造整个的项目结构.这就好比作一幅画,第一步就是描绘轮廓,有了轮廓,剩下的就是慢慢的填充细节.项目结构规划如下图: 项目结构描述: 本项目以fengzhengBlog为根目录. a ...

  3. 用django搭建一个简易blog系统(翻译)(一)

    Django 入门 原始网址: http://www.creativebloq.com/netmag/get-started-django-7132932 代码:https://github.com/ ...

  4. 用django搭建一个简易blog系统(翻译)(三)

    06. Connecting the Django admin to the blog app Django 本身就带有一个应用叫作Admin,而且它是一个很好的工具 在这一部分,我们将要激活admi ...

  5. 如何用django开发一个简易个人Blog

    功能概要:(目前已实现功能) 公共展示部分: 1.网站首页展示已发布的博客记录,包括名称.摘要信息.发布日期.阅读量及评论数. 2.首页文章列表可按照分类筛选. 3.点击标题或阅读全文链接,进入博客阅 ...

  6. 用django搭建一个简易blog系统(翻译)(四)

    12. Create the templates 你需要做三件事来去掉TemplateDoesNotExist错误 第一件,创建下面目录 * netmag/netmag/templates * net ...

  7. 用django搭建一个简易blog系统(翻译)(二)

    03. Starting the blog app 在这部分,将要为你的project创建一个blog 应用,通过编辑setting.py文件,并把它添加到INSTALLED_APPS. 在你的命令行 ...

  8. django开发简易博客(一)

    这几篇博客是根据GoodSpeed的博客该写的,看了他的博客收获很大,但是他的博客从第三篇开始,条理很不清晰,加之又是几年之前写的,编写环境发生很大改变,所以对他的博客进行了一个整理,加入了一些自己的 ...

  9. Django初体验——搭建简易blog

    前几天在网上看到了篇采用Django搭建简易博客的视频,好奇心驱使也就点进去学了下,毕竟自己对于Django是无比敬畏的,并不是很了解,来次初体验. 本文的操作环境:ubuntu.python2.7. ...

随机推荐

  1. Linux的phpstudy mysql登录

    使用绝对路径登录 /phpStudy/mysql/bin/mysql -uroot -p; 设置远程登录密码 GRANT ALL PRIVILEGES ON *.* TO 'itoffice'@'%' ...

  2. 批量创建SQL Server分区文件

    ) declare @i int set @table = 'v3_yqsd_report' begin exec('alter database '+@table+' add filegroup O ...

  3. C# Exception 写入文件

    /// <summary> /// 将异常打印到LOG文件 /// </summary> /// <param name="ex">异常< ...

  4. CentOS添加用户及赋予sudo权限

    在CentOS下添加一个用户假设用户名:username 密码:userpwd 新建用户: adduser username 修改密码: passwd username 根据提示重复输入两遍userp ...

  5. #笔记# CSS工作流

    目录 明确代码规范 CSS Reset 关于前缀 浮动闭合 CSS的前处理器(Preprocessor)和后处理器(Postprocessor) 明确代码规范 目的是确保跨平台协作多人开发的代码显示界 ...

  6. Log4j 与 Logback的ConversionPattern对比

    为了能将log4j的配置无缝转到logback,需要了解其中ConversionPattern的差异,以下是对比表格,内容来自: log4j官网 logback官网 其中可能需要转换的地方主要有两块: ...

  7. C# GetHashCode与Equals在HashTable表查找时的关系

    using System; using System.Collections.Generic; using System.Text; using Microsoft.Win32; using Syst ...

  8. 归并排序-java

    排序-归并排序 基本思想:是指将两个或两个以上的有序表合并成一个新的有序表. 具体步骤: (1首先将整个表看成是n个有序子表,每个子表的长度为1. (2)然后两两归并,得到n/2个长度为2的有序子表. ...

  9. WideCharToMultiByte和MultiByteToWideChar函数的用法

    为了支持Unicode编码,需要多字节与宽字节之间的相互转换.这两个系统函数在使用时需要指定代码页,在实际应用过程中遇到乱码问题,然后重新阅读<Windows核心编程>,总结出正确的用法. ...

  10. IO-04. 混合类型数据格式化输入(5)

    本题要求编写程序,顺序读入浮点数1.整数.字符.浮点数2,再按照字符.整数.浮点数1.浮点数2的顺序输出. 输入格式: 输入在一行中顺序给出浮点数1.整数.字符.浮点数2,其间以1个空格分隔. 输出格 ...