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

表字段

字段类型

备注

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

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

怎么在vscode里新建mysql数据库 vscode创建数据库_字段

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

怎么在vscode里新建mysql数据库 vscode创建数据库_字段_02

这样我们的数据库终于成功创建啦😸,接下来就可以使用后台来操作数据库啦

建立后台管理

数据库管理在django有多种方式

一、直接使用mysql语句在mysql终端管理数据

二、使用vscode的扩展插件管理(扩展见文章一)

三、使用django的后台管理数据

由于django有非常强大的后台可以直接配置使用,而且在日常的网站护理中也都会直接使用后台来管理,所以这里我们也要建立后台管理来方便我们以后的网站维护与作品发布。

最基本的前提是要先在settings.py里对其进行注册,就是在INSTALLED_APPS里把APP名添加进去(详见文章3),实际上admin是已经注册好的

然后我们需要在自己APP文件夹中的admin.py文件中对数据表做注册,代码如下:

from .models import Banner, Category, Tag, Tui, Article, Link 
#导入需要管理的数据库表

@admin.register(Article)
class ArticleAdmin(admin.ModelAdmin):
    list_display = ('id', 'category', 'title', 'tui', 'user', 'views', 'created_time')
    # 文章列表里显示想要显示的字段
    list_per_page = 50
    # 满50条数据就自动分页
    ordering = ('-created_time',)
    #后台数据列表排序方式
    list_display_links = ('id', 'title')
    # 设置哪些字段可以点击进入编辑界面



@admin.register(Banner)
class BannerAdmin(admin.ModelAdmin):
    list_display = ('id', 'text_info', 'img', 'link_url', 'is_active')

@admin.register(Category)
class CategoryAdmin(admin.ModelAdmin):
    list_display = ('id', 'name', 'index')

@admin.register(Tag)
class TagAdmin(admin.ModelAdmin):
    list_display = ('id', 'name')

@admin.register(Tui)
class TuiAdmin(admin.ModelAdmin):
    list_display = ('id', 'name')

@admin.register(Link)
class LinkAdmin(admin.ModelAdmin):
    list_display = ('id', 'name','linkurl')

然后我们需要给自己注册管理员账号,激活管理工具

通过下面命令即可设置账号密码

python manage.py createsuperuser

注:这里密码太短太简单都会提醒你重设

打开调试后在浏览器登录网址http://localhost:8000/admin/就能登录进入后台啦

怎么在vscode里新建mysql数据库 vscode创建数据库_自动生成_03


怎么在vscode里新建mysql数据库 vscode创建数据库_数据库_04