赞
踩
DJANGO通过model操作数据库,不管数据库的类型是mysql还是sqllite3都可以通过models来建立,models中的封装了对应的SQL语句,所以创建查询等操作都十分的方便,但是利用ORM 有一个很大的弊端,那就是数据库的SQL语句会很少使用,所以笔者在这里只做前期的使用,未来可能会用sql语句来代替。
每一个网站都会有自己的一个或者多个管理后台,网页中可以看到的数据如果使用html全部重新写一遍的话不仅费时间有时候也并没有什么意义,所以我们的博客网站页一定需要后台来方便我们管理网站并添加数据。
DJANGO中的模型基本原则如下:
· 每个模型在django中存在形式为一个python类
· 每个模型都是django.db.models.Model的一个子类
· 模型里的每一个类都代表数据库中的一个表
· 模型的每个字段(属性)代表数据表中的一个列
· DJANGO会为你自动生成数据库访问的API
接下来我们按照之前对数据结构的分析对数据进行创建,打开blogproject/blogproject/model.py
表名:Category、分类名:name
表字段 | 字段类型 | 备注 |
---|---|---|
id | INTEGER类型,长度为11 | 主键,表示文章,由系统自动生成 |
name | VARCHAR类型,长度为30 | 分类名 |
在model.py文件中写入:
#文章分类
class Category(models.Model):
name = models.CharField('博客分类',max_length = 100)
index = models.IntegerField(default = 999,verbose_name)
class Meta:
verbose_name = '博客分类'
verbose_name_plural = verbose_name
def __str__(self):
return self.name
表名Tag、分类名:name
表字段 | 字段类型 | 备注 |
---|---|---|
id | INTEGER类型,长度为11 | 主键,由系统自动生成 |
name | VARCHAR类型,长度为30 | 文章的标签名 |
在model.py文件中写入:
#文章标签
class Tag(models.Model):
name = models.CharField('文章标签',max_length = 100)
index = models.IntegerField(default = 999, verbose_name = '分类排序')
class Meta:
verbose_name = '文章标签'
verbose_name_plural = verbose_name
def __str__(self):
return self.name
表名Tui,分类名:name
表字段 | 字段类型 | 备注 |
---|---|---|
id | INTEGER类型,长度为11 | 主键,由系统自动生成 |
name | VARCHAR类型,长度为30 | 标签名 |
在model.py文件中写入:
class Tui(models.Model):
name = models.CharField('推荐位',max_length = 100)
index = models.IntegerField(default = 999, verbose_name = '分类排序')
class Meta:
verbose_name = '推荐位'
verbose_name_plural = verbose_name
def __str__(self):
return self.name
表名Article,分类名:title
表字段 | 字段类型 | 备注 |
---|---|---|
id | INTEGER类型,长度为11 | 主键,有系统自动生成 |
title | VARCHAR类型,长度为100 | 文章标题 |
category | FOREIGNKEY | 外键,关联文章分类表 |
tags | MANYTOMANYFIELD | 多对多,关联标签列表 |
body | TEXTFIELD | 文章内容 |
user | FOREIGNKEY | 外键,文章作者关联用户模型,系统自带 |
views | POSTIVEINTEGERFIELD | 文章浏览数,正的整数,不能为负 |
tui | FOREGNKEY | 外键,关联推荐位表 |
creates_time | DATETIMEFIELD | 文章发布时间 |
在model.py文件中写入:
class Article(models.Model): title = models.CharField('标题',max_length = 70) excerpt = models.TextField('摘要',max_length = 200,blank = True) category = models.ForeignKey(Category, on_delete = models.DO_NOTHING,verbose_name = '分类',blank = True,null = True) #使用外键关联分类表与分类是一对多关系 tags = models.ManyToManyField(Tag,verbose_name = '标签',blank = True) #使用外键关联标签表与标签是多对多关系 img = models.ImageField(upload_to='article_img/%Y/%m/%d/',verbose_name = '文章图片',blank = True, null = True) body = MDTextField() user = models.ForeignKey(User,on_delete=models.CASCADE,verbose_name = '作者') ''' 文章作者,这里User是从django.contrib.auth.models导入的 这里通过ForeignKey 把文章与User关联了起来 ''' views = models.PositiveIntegerField('阅读量',dafult = 0) tui = models.ForeignKey(Tui,on_delete = models.DO_NOTHING,verbose_name = '推荐位',blank = True,null = True) created_time = models.DateTimeField('发布时间',auto_now_add = True) modified_time = models.DateTimeField('修改时间',auto_now = True) class Meta: verbose_name = '文章' verbose_name_plural = '文章' def __str__(self): return self.title
这里的img中的upload_to = 'article_img/‘是指向了图片的上传目录,’%Y/%m/%d/'是自动在上传图片时加上上传时间
注:这里的body的类型是MDTextField,这是因为笔者后面需要markdown来写文章,这样的话会更加方便
表名Banner,分类名text_info
表字段 | 字段类型 | 备注 |
---|---|---|
id | INTEGER类型,字长11 | 主键,由系统自动生成 |
text_info | VARCHAR类型,字长100 | 标题,存储图片信息 |
img | IMAGE类型 | 图片类型,保存传图片的类型 |
link_url | URLFIELD类型 | 图片链接的URL |
is_active | BOOLEANFIELD | 有TRUE和FALSE两个类型,意思为是否激活 |
在model.py文件中写入:
class Banner(models.Model):
text_info = models.CharField('标题',max_length=50,default = '')
img = models.ImageField('轮播图',upload_to = 'banner/')
link_url = models.URLField('图片链接',max_length = 100)
is_active = models.BooleanField('是否是active',default = False)
def __str__(self):
return self.text_info
class Meta:
verbose_name = '轮播图'
verbose_name_plural = '轮播图'
这里的img中的upload_to = 'banner/'是指向了图片的上传目录
表名Link,分类名name
表字段 | 字段类型 | 备注 |
---|---|---|
id | INTEGER类型 | 主键,由系统自动生成 |
name | VARCHAR类型,长度为70 | 友情链接的名称 |
linkurl | URLFIELD类型 | 友情链接的URL |
在model.py文件中写入:
class Link(models.Model):
name = models.CharField('链接名称',max_length = 20)
linkurl = models.URLField('网址',max_length = 100)
def __str__(self):
return self.name
class Meta:
verbose_name = '友情链接'
verbose_name_plural = '友情链接'
这里我们只是创建了数据库的模型代码,真正的数据库创建还需要我们来进行数据库迁移
等所有的表都建立完成,接下来只要利用命令将数据库进行迁移即可:
python manage.py makemigrations
python manage.py migrate
注:在运行第一个命令之后,blogproject/migrations目录会自动生成几个000开头的文件,这里是数据库迁移的记录,而且支持手动更改,正真的数据库的创建是第二句命令
在这里可能会出现一些错误
笔者这里出现以下报错
SystemCheckError: System check identified some issues:
ERRORS:
myblog.Article.img: (fields.E210) Cannot use ImageField because Pillow is not installed.
HINT: Get Pillow at https://pypi.org/project/Pillow/ or run command "python -m pip install Pillow".
原因是图片上传需要Pillow模块的支持,所以可以执行下面语句下载Pillow模块,完成后再执行语句即可成功
pip install Pillow
这是运行第一个命令后的效果
这是运行第二个命令后的效果
这样我们的数据库终于成功创建啦
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。