2.数据库表设计及其创建

表设计

# 1.用户表
    继承AbstractUser
    字段
      phone(用户手机号)
      avatar(用户头像)
      create_time(创建时间)
    外键字段
      一对一个人站点表
# 2.个人站点表
    字段
      site_name(站点名称)
      site_title(站点标题)
      site_theme(站点样式(用来存放css文件))

# 3.文章标签表(一篇文章可以有多个标签)
    字段
      name(文章标签名(后面的数字是动态算出来的))
    外键字段
      一对多个人站点

# 4.文章分类表(一篇文章只能有一种分类)
    字段
      name(分类名)
    外键字段
      一对多个人站点

# 5.文章表
    字段
      title(文章标题)
      desc(文章摘要)
      content(文章内容)
      create_time(发布时间)
      数据库优化设计(******)
        虽然下述的三个字段可以从其他表里通过跨表查询计算出来,但是频繁跨表效率低
        up_num(点赞数)
        down_num(点踩数)
        comment_num(评论数)
    外键字段
      一对多个人站点
      多对多文章标签
      一对多文章分类
    
# 6.点赞点踩表(记录哪个用户给哪篇文章点赞了还是点踩了)
    user(用户)          ForeignKey(to="User")
    article(文章)       ForeignKey(to="Article")
    is_up(是否点赞)     BooleanField()
      1    1    1
      1    2    1
      1    3    0
      2    1    1

# 7.文章评论表(记录哪个用户给哪篇文章评论了哪些内容)
    user(用户)             ForeignKey(to="User")
    article(文章)          ForeignKey(to="Article")
    content(内容)          CharField()
    comment_time(评论时间)  DateField()
    # 自关联
    parent()   ForeignKey(to="Comment",null=True)
    # ORM专门提供的自关联写法
    parent()   ForeignKey(to="self",null=True)
    
    user_id     article_id     parent_id
      1             1              1
      2             2              1
    
    根评论子评论的概念
        跟评论就是直接评论当前发布的内容
        子评论就是评论别人的评论
            1 PHP是世界上最强大的语言
                1.1 python才是世界上最强大的语言
                1.2 java才是世界上最强大的语言
        # 跟评论与子评论是一对多的关系

表创建

准备工作

  • 由于UserInfo表继承了AbstractUser表,所以要在配置文件中配置

  •  由于需要使用用户的头像

from django.db import models

# Create your models here.
from django.contrib.auth.models import AbstractUser


class UserInfo(AbstractUser):
    phone = models.BigIntegerField(null=True, verbose_name='手机号')
    avatar = models.FileField(upload_to='avatar/', default='avatar/default.png', verbose_name='用户头像')
    # 给avatar字段传文件对象,该文件会自动存储在avatar文件夹下,avatar字段只保存文件路径(avatar/default.png)
    create_time = models.DateField(auto_now_add=True, verbose_name='创建时间')
    Blog = models.OneToOneField(to='Blog', on_delete=models.CASCADE, null=True)


class Blog(models.Model):
    site_name = models.CharField(max_length=32, verbose_name='站点名称')
    site_title = models.CharField(max_length=32, verbose_name='站点标题')
    site_theme = models.CharField(max_length=64, verbose_name='站点样式')  # 存css/js文件路径


class Category(models.Model):
    name = models.CharField(max_length=32, verbose_name='标签名')
    blog = models.ForeignKey(to='Blog', on_delete=models.CASCADE, null=True)


class Tag(models.Model):
    name = models.CharField(max_length=32, verbose_name='分类名')
    blog = models.ForeignKey(to='Blog', on_delete=models.CASCADE, null=True)


class Article(models.Model):
    title = models.CharField(max_length=32, verbose_name='文章标题')
    desc = models.CharField(max_length=255, verbose_name='文章摘要')
    content = models.TextField(verbose_name='文章内容')  # 文章内容有很多,一般情况下都是用TextField
    create_time = models.DateField(auto_now_add=True, verbose_name='文章创建时间')

    # 数据库字段优化设计
    up_num = models.BigIntegerField(default=0, verbose_name='点赞数')
    down_num = models.BigIntegerField(default=0, verbose_name='点踩数')
    comment_num = models.BigIntegerField(default=0, verbose_name='评论数')

    blog = models.ForeignKey(to='Blog', on_delete=models.CASCADE, null=True)
    category = models.ForeignKey(to='Category', on_delete=models.CASCADE, null=True)
    tags = models.ManyToManyField(to='Tag',
                                  through='ArticleAndTag',
                                  through_fields=('article', 'tag')
                                  )


class ArticleAndTag(models.Model):
    article = models.ForeignKey(to='Article', on_delete=models.CASCADE)
    tag = models.ForeignKey(to='Tag', on_delete=models.CASCADE)


class UpAndDown(models.Model):
    user = models.ForeignKey(to='UserInfo', on_delete=models.CASCADE)
    article = models.ForeignKey(to='Article', on_delete=models.CASCADE)
    is_up = models.BooleanField()  # 传布尔值,存0/1


class Comment(models.Model):
    user = models.ForeignKey(to='UserInfo', on_delete=models.CASCADE)
    article = models.ForeignKey(to='Article', on_delete=models.CASCADE)
    content = models.CharField(max_length=256, verbose_name='评论内容')
    comment_time = models.DateTimeField(auto_now_add=True, verbose_name='评论时间')
    # 自关联
    parent = models.ForeignKey(to='self', null=True, on_delete=models.CASCADE)  # 有些评论就是根评论
models.py

 

posted @ 2023-04-12 15:50  猿小姜  阅读(233)  评论(0编辑  收藏  举报