当前位置:   article > 正文

vscode+django 搭建自己的个人网站(四) ——利用ORM创建数据库模型并建立后台管理_django 、mysql、vscode 管理系统

django 、mysql、vscode 管理系统

vscode+django 搭建自己的个人网站(四) ——利用ORM创建数据库模型并建立后台 管理

前言

​ DJANGO通过model操作数据库,不管数据库的类型是mysql还是sqllite3都可以通过models来建立,models中的封装了对应的SQL语句,所以创建查询等操作都十分的方便,但是利用ORM 有一个很大的弊端,那就是数据库的SQL语句会很少使用,所以笔者在这里只做前期的使用,未来可能会用sql语句来代替。

​ 每一个网站都会有自己的一个或者多个管理后台,网页中可以看到的数据如果使用html全部重新写一遍的话不仅费时间有时候也并没有什么意义,所以我们的博客网站页一定需要后台来方便我们管理网站并添加数据。

ORM创建数据库

DJANGO中的模型基本原则如下:

· 每个模型在django中存在形式为一个python类

· 每个模型都是django.db.models.Model的一个子类

· 模型里的每一个类都代表数据库中的一个表

· 模型的每个字段(属性)代表数据表中的一个列

· DJANGO会为你自动生成数据库访问的API

接下来我们按照之前对数据结构的分析对数据进行创建,打开blogproject/blogproject/model.py

分类表

表名:Category、分类名:name

表字段字段类型备注
idINTEGER类型,长度为11主键,表示文章,由系统自动生成
nameVARCHAR类型,长度为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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
标签表

表名Tag、分类名:name

表字段字段类型备注
idINTEGER类型,长度为11主键,由系统自动生成
nameVARCHAR类型,长度为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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
推荐表

表名Tui,分类名:name

表字段字段类型备注
idINTEGER类型,长度为11主键,由系统自动生成
nameVARCHAR类型,长度为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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
文章表

表名Article,分类名:title

表字段字段类型备注
idINTEGER类型,长度为11主键,有系统自动生成
titleVARCHAR类型,长度为100文章标题
categoryFOREIGNKEY外键,关联文章分类表
tagsMANYTOMANYFIELD多对多,关联标签列表
bodyTEXTFIELD文章内容
userFOREIGNKEY外键,文章作者关联用户模型,系统自带
viewsPOSTIVEINTEGERFIELD文章浏览数,正的整数,不能为负
tuiFOREGNKEY外键,关联推荐位表
creates_timeDATETIMEFIELD文章发布时间

在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
  • 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

这里的img中的upload_to = 'article_img/‘是指向了图片的上传目录,’%Y/%m/%d/'是自动在上传图片时加上上传时间

注:这里的body的类型是MDTextField,这是因为笔者后面需要markdown来写文章,这样的话会更加方便

轮播图表

表名Banner,分类名text_info

表字段字段类型备注
idINTEGER类型,字长11主键,由系统自动生成
text_infoVARCHAR类型,字长100标题,存储图片信息
imgIMAGE类型图片类型,保存传图片的类型
link_urlURLFIELD类型图片链接的URL
is_activeBOOLEANFIELD有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 = '轮播图'
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

这里的img中的upload_to = 'banner/'是指向了图片的上传目录

友情链接表

表名Link,分类名name

表字段字段类型备注
idINTEGER类型主键,由系统自动生成
nameVARCHAR类型,长度为70友情链接的名称
linkurlURLFIELD类型友情链接的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 = '友情链接'
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

这里我们只是创建了数据库的模型代码,真正的数据库创建还需要我们来进行数据库迁移

等所有的表都建立完成,接下来只要利用命令将数据库进行迁移即可:

python manage.py makemigrations
python manage.py migrate
  • 1
  • 2

注:在运行第一个命令之后,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".
  • 1
  • 2
  • 3
  • 4
  • 5

原因是图片上传需要Pillow模块的支持,所以可以执行下面语句下载Pillow模块,完成后再执行语句即可成功

pip install Pillow
  • 1

这是运行第一个命令后的效果

在这里插入图片描述

这是运行第二个命令后的效果

在这里插入图片描述

这样我们的数据库终于成功创建啦

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/186787
推荐阅读
相关标签