It's our wits that make us men.

Django博客开发教程-7:创建数据库模型

Posted on By ZY
个人分类:Django

Django是通过Model操作数据库,不管你数据库的类型是MySql或者Sqlite,Django它自动帮你生成相应数据库类型的SQL语句,所以不需要关注SQL语句和类型,对数据的操作Django帮我们自动完成。只要会写Model就可以了!

django根据代码中定义的类来自动生成数据库表。我们写的类表示数据库的表,如果根据这个类创建的对象是数据库表里的一行数据,对象.id 对象.value是每一行里的数据。

基本的原则如下: 每个模型在Django中的存在形式为一个Python类 每个模型都是django.db.models.Model的子类 模型里的每个类代表数据库中的一个表 模型的每个字段(属性)代表数据表的某一列 Django将自动为你生成数据库访问API

之前我们在前面的数据库设计分析文章里已经分析过数据库的结构。完成博客,我们需要存储六种数据:文章分类、文章正文、文章标签、幻灯图、推荐位、友情链接。每种数据一个表。

数据表结构设计

分类表结构设计:

表名:Category、分类名:name

标签表设计:

表名:Tag、标签名:name

文章表结构设计:

表名:Article、标题:title、摘要:excerpt、分类:category、标签:tags、推荐位、内容:body、创建时间:created_time、作者:user、文章封面图片img

幻灯图表结构设计:

表名:Banner、图片文本text_info、图片img、图片链接link_url、图片状态is_active。

推荐位表结构设计:

表名:Tui、推荐位名name。

友情链接表结构设计:

表名:Link、链接名name、链接网址linkurl。

其中:

文章和分类是一对多的关系,文章和标签是多对多的关系,文章和作者是一对多的关系,文章和推荐位是一对多关系(看自己的需求,也可以设计成多对多)。

设计代码

打开blog/models.py,输入代码:

#!/usr/bin/env python
# coding=utf-8

from django.db import models
from django.contrib.auth.models import User
from DjangoUeditor.models import UEditorField

# 分类表结构设计
class Category(models.Model):
    name = models.CharField('博客分类', max_length=100)
    index = models.IntegerField(default=5, verbose_name='分类排序')

    class Meta:
        verbose_name = '博客分类'
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.name

# 标签表设计
class Tag(models.Model):
    name = models.CharField('文章标签', max_length=100)

    # 模型元数据Meta
    class Meta:
        # 给你的模型类起一个更可读的名字一般定义为中文
        verbose_name = '文章标签'
        # 这个选项是指定,模型的复数形式是什么,如果不指定会自动在模型名称后加一个’s’
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.name

# 推荐位
class Tui(models.Model):
    name = models.CharField('推荐位', max_length=100)

    class Meta:
        verbose_name = '推荐位'
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.name

# 文章
class Article(models.Model):
    title = models.CharField('标题', max_length=70)
    excerpt = models.TextField('摘要', max_length=200, blank=True)
    # 使用外键关联分类表,文章与分类是一对多关系,一篇文章对应一个分类,一个分类可以有多篇文章
    # blank=True,表示你的表单填写该字段的时候可以不填
    # null=True, 表示数据库的该字段可以为空,那么在新建一个model对象的时候是不会报错的
    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 = models.TextField(verbose_name='文章正文') # 最初设置
    # imagePath="upimg/", filePath="upfile/" 这两个是图片和文件上传的路径
    # 上传文件,会自动上传到项目根目录media文件夹下对应的upimg和upfile目录里
    # 正文中引入UEditor富文本框
    body = UEditorField('内容',width=800,height=500,toolbars='full',imagePath='upimg/',filePath='upfile/',
                        upload_settings={'imageMaxSize':1204000},settings={},command=None,blank=True)
    # 文章作者,这里User是从django.contrib.auth.models导入的。
    # 我们通过 ForeignKey 把文章和 User 关联了起来。
    user = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name='作者')
    views = models.PositiveIntegerField('阅读量', default=0)
    tui = models.ForeignKey(Tui, on_delete=models.DO_NOTHING, verbose_name='推荐位', blank=True, null=True)
    # auto_now_add 创建时自动更新当前时间
    created_time = models.DateTimeField('发布时间', auto_now_add=True)
    # auto_now 更新时自动更新当前时间
    modified_time = models.DateTimeField('修改时间', auto_now=True)

    class Meta:
        verbose_name = '文章'
        verbose_name_plural = '文章'

    def __str__(self):
        return self.title

# Banner
class Banner(models.Model):
    text_info = models.CharField('标题',max_length=50,default='')
    img = models.ImageField('轮播图',upload_to='banner/')
    link_url = models.URLField('图片链接',max_length=300)
    is_active = models.BooleanField('是否是active',default=False)

    def __str__(self):
        return self.text_info

    class Meta:
        verbose_name = '轮播图'
        verbose_name_plural = '轮播图'

# 友情链接
class Link(models.Model):
    name = models.CharField('链接名称',max_length=50)
    linkurl = models.URLField('网址',max_length=300)

    def __str__(self):
        return self.name

    class Meta:
        verbose_name = '友情链接'
        verbose_name_plural = '友情链接'

这里面我们多增加了一个img图片封面字段,用于上传文章封面图片的,article_img/为上传目录,%Y/%m/%d/为自动在上传的图片上加上文件上传的日期。

里面的模型字段与模型元数据Meta选项详解我在这里就不做过多介绍,更多请点击文章数据模型字段及属性详解模型元数据Meta选项详解了解

我们已经编写了博客数据库模型的代码,但那还只是 Python 代码而已,Django 还没有把它翻译成数据库语言,因此实际上这些数据库表还没有真正的在数据库中创建。我们需要进行数据库迁移。

配置数据库

在迁移之前,我们先需要设置数据库,如果我们使用默认的数据库的话,就不需要设置,Django默认使用sqlite3数据库。

如果我们想使用Mysql数据库的话,则需要我们单独配置。我们打开settings.py文件,找到DATABASES,然后把它修改成如下代码:

############修改成mysql如下:
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'test',    #你的数据库名称
        'USER': 'root',   #你的数据库用户名
        'PASSWORD': '445813', #你的数据库密码
        'HOST': '', #你的数据库主机,留空默认为localhost
        'PORT': '3306', #你的数据库端口
    }}

#由于mysql默认引擎为MySQLdb,在__init__.py文件中添加下面代码
#在python3中须替换为pymysql,可在主配置文件(和项目同名的文件下,不是app配置文件)中增加如下代码
#import pymysql
#pymysql.install_as_MySQLdb()
#如果找不到pymysql板块,则通过pip install pymysql进行安装。

更多关于Django数据库的配置,请查看官方文档:数据库设置

进行数据库迁移

数据库设置好之后,我们就依次输入下面的命令进行数据库迁移:

python manage.py makemigrations
python manage.py migrate

迁移的时候,会有如下提示:

出现这个原因是因为我们的幻灯图使用到图片字段,我们需要引入图片处理包。提示里也给了我们处理方案,输入如下命令,安装Pillow模块即可:

pip install Pillow

安装成功之后再迁移数据库:

数据库迁移成功之后,程序会在blog下的migrations目录里自动生成几个000开头的文件,文件里面记录着数据库迁移记录:

大家可以查看一下。了解迁移的过程。本文就不做过多介绍。