django开发个人简易Blog——数据模型
提到数据模型,一定要说一下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——数据模型的更多相关文章
- django开发个人简易Blog—nginx+uwsgin+django1.6+mysql 部署到CentOS6.5
前面说完了此项目的创建及数据模型设计的过程.如果未看过,可以到这里查看,并且项目源码已经放大到github上,可以去这里下载. 代码也已经部署到sina sea上,地址为http://fengzhen ...
- django开发个人简易Blog——构建项目结构
开发之前第一步,就是构造整个的项目结构.这就好比作一幅画,第一步就是描绘轮廓,有了轮廓,剩下的就是慢慢的填充细节.项目结构规划如下图: 项目结构描述: 本项目以fengzhengBlog为根目录. a ...
- 用django搭建一个简易blog系统(翻译)(一)
Django 入门 原始网址: http://www.creativebloq.com/netmag/get-started-django-7132932 代码:https://github.com/ ...
- 用django搭建一个简易blog系统(翻译)(三)
06. Connecting the Django admin to the blog app Django 本身就带有一个应用叫作Admin,而且它是一个很好的工具 在这一部分,我们将要激活admi ...
- 如何用django开发一个简易个人Blog
功能概要:(目前已实现功能) 公共展示部分: 1.网站首页展示已发布的博客记录,包括名称.摘要信息.发布日期.阅读量及评论数. 2.首页文章列表可按照分类筛选. 3.点击标题或阅读全文链接,进入博客阅 ...
- 用django搭建一个简易blog系统(翻译)(四)
12. Create the templates 你需要做三件事来去掉TemplateDoesNotExist错误 第一件,创建下面目录 * netmag/netmag/templates * net ...
- 用django搭建一个简易blog系统(翻译)(二)
03. Starting the blog app 在这部分,将要为你的project创建一个blog 应用,通过编辑setting.py文件,并把它添加到INSTALLED_APPS. 在你的命令行 ...
- django开发简易博客(一)
这几篇博客是根据GoodSpeed的博客该写的,看了他的博客收获很大,但是他的博客从第三篇开始,条理很不清晰,加之又是几年之前写的,编写环境发生很大改变,所以对他的博客进行了一个整理,加入了一些自己的 ...
- Django初体验——搭建简易blog
前几天在网上看到了篇采用Django搭建简易博客的视频,好奇心驱使也就点进去学了下,毕竟自己对于Django是无比敬畏的,并不是很了解,来次初体验. 本文的操作环境:ubuntu.python2.7. ...
随机推荐
- 1074. Reversing Linked List (25)
模拟题,注意当k == 1 与 k == n时情况 #include <stdio.h> #include <string.h> #include <iostream&g ...
- webrtc进阶-信令篇-之三:信令、stun、turn、ice
webRTC支持点对点通讯,但是webRTC仍然需要服务端: . 协调通讯过程中客户端之间需要交换元数据, 如一个客户端找到另一个客户端以及通知另一个客户端开始通讯. . 需要处理NAT(网 ...
- css3选择器总结
1.p[class^/$/*=td]所有p标签的前面带有td/后面带有td/所有带有td的类的三种样式. 2.div:first-child/last-child/nth-child()在父元素下的第 ...
- 【OpenGL】如何绘制Shadow
背景 Shadow即阴影,它是光线被不透明物体遮挡而产生的黑暗区域,与光源的方向相反. 在Blender中编辑过程中没有Shadow,只有在经过渲染后才能显示.目前有一个基于Blender的项目,要求 ...
- JS获得URL超链接的参数值
/** * 获取指定URL的参数值 * @param url 指定的URL地址 * @param name 参数名称 * @return 参数值 */ function getUrlParam(ur ...
- S2SH简介
struts2简介 Struts2是由WebWork基础上发展起来的,与struts1比较,选用struts2的理由是:①Struts1要求Action类继承一个抽象基类,而Struts 2 Acti ...
- springboot maven install 找不到符号
好多朋友在网上找maven install 找不到符号,我今天也遇到了同样的问题,我项目结构如下: 在multicreate-web这个项目引用了multicreate-service的jar包,在i ...
- win8.1下golang+sdl2.0环境搭建
sdl2.0的golang绑定我是使用的这个,但是它的官方介绍里面只有linux以及OSX系统的说明,没有windows的,在我的mbp上弄好以后就考虑在win下也搭建一个开发环境,这样就能比较方便的 ...
- c++中的指针
指针用起来是一把利器,但用得不好的童鞋 无异于 火上浇油 ,下面笔者将自己学习 的一点小小心得,与君共享 指针在类中 1.对象指针 初始化 Point a(4,5); Point *p1 = & ...
- cs程序添加初始化加载
this.Name = "mysirst"; this.Text = "车辆窗体程序"; this.Load += new System.EventHandle ...