您现在的位置是:网站首页>>编程开发编程开发

Django个人博客开发(五)数据库与Model 设计

发布时间:2018-04-14 10:04:08分类:编程开发阅读:1242

    概述

    分析设计项目数据库表及其字段,然后通过workbench创建对应的数据库模型。通过编写相应的Model类,将数据库迁移到Mysql服务器上。

    1、分析项目数据库表及其字段

    Django个人博客数据库表

    tag|标签表

    字段

    类型

    描述

    备注

    id

    主键

    name

    CharField(max_length=30)

    标签名称

    is_disply

    BooleanField(default=True)

    是否显示





    category|分类表

    字段

    类型

    描述

    备注

    id

    主键

    name

    CharField(max_length=30)

    分类名称

    index

    IntegerField(default=999)

    分类排序





    article|文章表

    字段

    类型

    描述

    备注

    id

    主键

    title

    CharField(max_length=60)

    文章标题

    slug

    CharField(max_length=100)

    文章标题链接名

    abstract

    TextField(max_length=200)

    文章摘要

    content

    TextField()

    文章内容

    picture

    ImageField(upload_to=,blank=True)

    图片

    hits

    IntegerField(default=0)

    点击次数

    is_recommend

    BooleanField(default=0)

    是否推荐

    publish

    DateTimeField(auto_now_add=True)

    发布时间

    category

    ForeignKey(Category, related_name='article')

    分类

    外键category

    tags

    ManyToManyField(Tag, related_name='arfticle')

    标签

    多对多tag





    comment|评论表

    字段

    类型

    描述

    备注

    id

    主键

    content

    TextField()

    评论内容

    username

    CharField(max_length=45, blank=True)

    用户名

    email

    EmailField(blank=True)

    邮箱地址

    url

    URLField(blank=True)

    个人网页地址

    publish

    DateTimeField(auto_now_add=True)

    发布时间

    article

    ForeignKey(Article, related_name='comment')

    文章

    外键article

    pid

    IntegerField()

    父级评论





    links|友情链接表

    字段

    类型

    描述

    备注

    id

    主键

    title

    CharField(max_length=45)

    标题

    description

    CharField(max_length=100)

    表情链接描述

    url

    URLField()

    url地址

    publish

    DateTimeField(auto_now_add=True)

    发布时间

    index

    IntegerField(default=999)

    排列顺序


    2、用workbench创建数据库模型

    3、编写Model类,文件blog/models.py

    from django.db import models
    from slugify import slugify
    from django.shortcuts import reverse
    
    # Create your models here.
    
    # 文件上传路径(/MEDIA_ROOT/article_picture/文章id/文件名)
    def upload_generation_dir(instance, filename):
        name, suffix = filename.rsplit('.', 1)  # 拆开文件和扩展名(如:'图片文件.png'则取'图片文件'和'png')
        return 'article_picture/{0}-{1}.{2}'.format(instance.id, slugify(name), suffix)
    
    # 文章分类表数据模型
    class Category(models.Model):
        name = models.CharField(max_length=30, verbose_name='分类名称')
        index = models.IntegerField(default=999, verbose_name='分类排序(从大到小)')
    
        class Meta:
            ordering = ['index']
            verbose_name = '文章分类'
            verbose_name_plural = verbose_name
    
        def __str__(self):
            return self.name
    
    # 标签表数据模型
    class Tag(models.Model):
        name = models.CharField(max_length=30, verbose_name='标签名')
        is_display = models.BooleanField(default=True, verbose_name='是否显示(默认是)')
    
        class Meta:
            verbose_name = '标签'
            verbose_name_plural = verbose_name
        
        # 返回当前标签下文章数
        def article_count(self):
            return self.article.all().count()
    
        def __str__(self):
            return self.name
    
    # 文章表数据模型
    class Article(models.Model):
        title = models.CharField(max_length=60, verbose_name='文章标题')
        category = models.ForeignKey(Category, related_name='article', verbose_name='分类')
        slug = models.CharField(max_length=200, verbose_name='标题映射链接名')
        abstract = models.TextField(max_length=400, verbose_name='文章摘要')
        content = models.TextField(verbose_name='文章内容')
        picture = models.ImageField(upload_to=upload_generation_dir, blank=True, verbose_name='文章展示图片')
        hits = models.IntegerField(default=0, verbose_name='点击次数')
        is_recommend = models.BooleanField(default=False, verbose_name='是否推荐(默认否)')
        publish = models.DateTimeField(auto_now_add=True, verbose_name='发布时间')
        tag = models.ManyToManyField(Tag, related_name='article', verbose_name='标签')
    
        class Meta:
            ordering = ['-publish']
            verbose_name = '文章'
            verbose_name_plural = verbose_name
    
        # 重写save()方法
        def save(self, *args, **kwargs):
            self.slug = slugify(self.title)    # 转标题转换为链接标题格式,如"我的博客"转换为"wo-de-bo-ke"
            super(Article, self).save(*args, **kwargs)
    
        # 获取文章详情链接URL
        def get_absolute_url(self):
            return reverse('blog:article_detail', args=[self.id, self.slug])
    
        def __str__(self):
            return "【{0}】 {1}".format(self.category.name, self.title)
    
    # 评论表数据模型
    class Comment(models.Model):
        content = models.TextField(verbose_name='评论内容')
        username = models.CharField(max_length=45, verbose_name='用户名', blank=True)
        email = models.EmailField(verbose_name='邮箱', blank=True)
        url = models.URLField(verbose_name='网址', blank=True)
        publish = models.DateTimeField(auto_now_add=True, verbose_name='评论时间')
        article = models.ForeignKey(Article, related_name='comment', verbose_name='文章')
        pid = models.IntegerField(verbose_name='父级ID')
    
        class Meta:
            ordering = ['-publish']
            verbose_name = '留言/评论'
            verbose_name_plural = verbose_name
    
        def __str__(self):
            return str(self.id)
    
    # 友情链接表数据模型
    class Links(models.Model):
        title = models.CharField(max_length=45, verbose_name='链接标题')
        description = models.CharField(max_length=100, verbose_name='链接描述')
        url = models.URLField(verbose_name='链接网址')
        publish = models.DateTimeField(auto_now_add=True, verbose_name='发布时间')
        index = models.IntegerField(default=999, verbose_name='排序(从大到小)')
    
        class Meta:
            ordering = ['-publish']
            verbose_name = '友情链接'
            verbose_name_plural = verbose_name
    
        def __str__(self):
            return self.title
    

    4、创建对应的Mysql

    sh# mysql -uroot -p -e “CREATE database db_xdsite DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;”

    5、在xdsite/settings.py中配置Mysql

    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME': 'db_xdsite',
            'HOST': '192.168.100.1',
            'PORT': '3306',
            'USER': 'webapp',
            'PASSWORD': 'web123456app',
        }
    }
    
    6、迁移数据库到Mysql服务器上

    (VENV_PY35) E:\Program_Code\PyProject\xdsite>python manage.py makemigrations

    (VENV_PY35) E:\Program_Code\PyProject\xdsite>python manage.py migrate

    7、检查Mysql数据库服务器上是否有对应的库表

    代码查看:https://github.com/xdao07/xdsite/tree/v0.0.2

    代码下载:git clone --branch v0.0.2 https://github.com/xdao07/xdsite.git