bbs项目前期准备和表设计

一、前期准备

1.新建一个django项目
2.连接mysql数据库(注意需要在init文件里面书写import pymysql),告诉django使用pymysql连接数据库
3.静态文件路径在settings里配置一下,并且在项目文件夹下新建一个静态文件夹
4.将需要用到bootstrap的css和js文件添加到static文件夹内

二、bbs项目表设计

做一个项目最首要的表的设计,一个表设计不好,后续开发的地基就不牢!

"""
1.用户表:要继承AbstractUser类
扩展字段:
    phone:用户电话
    avatar:用户头像
    create_time:创建时间

2.个人站点表:用户输入什么url就跳转到对应的站点
字段:
    site_name:站点名称
    site_title:站点标题
    site_theme:站点主题

3.文章表:
字段:
    title:文章标题
    desc:文章简介
    content:文章内容
    create_time:发布时间
下述三个字段虽然可以从其他表中获取,但是频繁的跨表查询效率较低,
可以直接在文章表里设计该字段,点赞数+1时只要同步给文章表里的该字段+1就行!(数据库字段优化)
    up_num:点赞数
    down_num:点踩数
    comment_num:评论数

4.文章分类表:
字段:
    name:分类名

5.文章标签表:
字段:
    name:标签名

6.点赞点踩表:记录了哪个用户给哪个文章点赞还是点踩
字段:
    user:用户主键值  ForeignKey(to='UserInfo')
    article:文章主键值 ForeignKey(to='Article')
    is_up:是否点赞(布尔值字段类型)
    is_down:是否点踩(布尔值字段类型)

7.评论表:记录哪个用户给哪个文章评论了什么内容
字段:
    user:用户 ForeignKey(to='UserInfo')
    article:文章 ForeignKey(to='Article')
    content:评论内容
    comment_time:评论时间
    # 评论内容有跟评论和子评论的区别,跟评论是直接评论文章的,子评论是评论跟评论的
    parent:自关联  ForeignKey(to='Comment',null=True) to里面也可以写成self表示自己关联自己
"""

七张表之间的关系

1.用户表和个人站点表:一对一关系,外键建在用户表

2.个人站点表和文章标签表:一对多关系,外键建在文章标签表

3.个人站点表和文章分类 表:一对多关系,外键建在文章分类表

4.个人站点和文章表:一对多关系,外键建在文章表

5.文章表和文章标签表:多对多关系,外键建在文章表

6.文章表和文章分类表:一对多关系,外键建在文章分类表

接下来,我们就可以在models.py里创建对应的表了!

bbs项目表创建源码

from django.db import models
from django.contrib.auth.models import AbstractUser

Create your models here.

1、用户表:继承AbstractUser类,需要先导入这个类
class UserInfo(AbstractUser):
    phone = models.BigIntegerField(verbose_name='电话',null=True)
    avatar = models.FileField(upload_to='avatar/',default='avatar/default.png',verbose_name='头像')
"""
    给avatar字段传文件对象,该文件会自动保存到upload_to='avatar/'指定的文件夹下,这个文件夹需要自己在项目文件夹下创建
    数据库里的avatar字段只保存文件路径,同时可以设置一个默认头像
"""
    create_time = models.DateTimeField(auto_now_add=True,verbose_name='创建时间')
    # 用户表与个人站点表一对一关系,外键建在用户表
    blog = models.OneToOneField(to='Blog',on_delete=models.CASCADE,null=True)

2、个人站点表
class Blog(models.Model):
    site_name = models.CharField(verbose_name='站点名称',max_length=64)
    site_title = models.CharField(verbose_name='站点标题',max_length=64)
    site_theme = models.CharField(verbose_name='站点主题',max_length=256) # 存的是css、js样式的路径

3、文章表
class Article(models.Model):
    title = models.CharField(verbose_name='文章标题',max_length=64)
    desc = models.CharField(verbose_name='文章摘要',max_length=256)
    content = models.TextField(verbose_name='文章内容')
    create_time = models.DateTimeField(verbose_name='创建时间',auto_now_add=True)
    # 数据库字段设计优化
    up_num = models.IntegerField(verbose_name='点赞数',default=0)
    down_num = models.IntegerField(verbose_name='点踩数',default=0)
    comment_num = models.IntegerField(verbose_name='评论数',default=0)
    # 个人站点表和文章表一对多关系,外键建在文章表
    blog = models.ForeignKey(to='Blog',on_delete=models.CASCADE,null=True)
    # 文章表和文章分类表是一对多关系,外键建在文章表
    category = models.ForeignKey(to='Category',null=True,on_delete=models.CASCADE)
    # 多对多关系表的外键
    tag = models.ManyToManyField(to='Tag',through='Article2Tag',through_fields=('article','tag'))
    # 通过Article2Tag这个张表查article就把Article2Tag里的article字段放前面

文章表和标签表的多对多表创建,采用的是半自动的方式,利用扩展自动和查询
class Article2Tag(models.Model):
    article = models.ForeignKey(to='Article',null=True,on_delete=models.CASCADE)
    tag = models.ForeignKey(to='Tag',null=True,on_delete=models.CASCADE)

4、文章分类表
class Category(models.Model):
    name = models.CharField(verbose_name='分类名',max_length=32)
    # 个人站点表和文章分类表是一对多关系,外键建在文章分类表
    blog = models.ForeignKey(to='Blog',null=True,on_delete=models.CASCADE)

5、文章标签表
class Tag(models.Model):
    name = models.CharField(verbose_name='标签名',max_length=32)
    # 个人站点表和文章标签表是一对多关系,外键建在文章标签表
    blog = models.ForeignKey(to='Blog',null=True,on_delete=models.CASCADE)

6、点赞点踩表
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()

7、评论表
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(verbose_name='评论内容',max_length=256)
    create_time = models.DateTimeField(verbose_name='评论时间',auto_now_add=True)
    # 子评论,自关联
    parent = models.ForeignKey(to='self',on_delete=models.CASCADE,null=True)

Original: https://www.cnblogs.com/suncolor/p/16751317.html
Author: 等日落
Title: bbs项目前期准备和表设计

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/611198/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • tomcat部署war包 首页面默认展示自己定义的页面

    将项目war包部署到tomcat的webapps后,http://localhost:8080 展示tomcat页面,http://localhost:8080/appName展示…

    数据库 2023年6月16日
    070
  • 如何使用Intellij IDEA工具导入SVN项目

    步骤一:选择VCS 打开Intellij IDEA开发工具,在导航栏中选择 VCS栏位,如图。 步骤二:创建SVN地址 执行步骤二,可以看见打开了一个SVN Repositorie…

    数据库 2023年6月6日
    078
  • Javaweb-文件上传和邮件发送

    1.文件上传 新建空项目 准备工作 在maven仓库里下载commons io 和 commons fileupload两个jar包 实用类介绍 文件上传注意事项 为保证服务器安全…

    数据库 2023年6月16日
    077
  • 2022-8-17 mysql 第三天

    子查询 按照结果集的行列数不同,子查询可以分为以下几类: 标量子查询:结果集只有一行一列(单行子查询) 列子查询:结果集有一列多行 行子查询:结果集有一行多列 表子查询:结果集多行…

    数据库 2023年6月14日
    067
  • Element UI的第一个程序(标签使用)

    1:Element UI 官方文档:https://element.faas.ele.me/ 2:Element UI是什么? 网站快速成型工具 *Element,一套为开发者、设…

    数据库 2023年6月6日
    094
  • jspdf.js+html2canvas将HTMl导出PDF

    jspdf.js+html2canvas将HTMl导出PDF 功能: PDF分页插入页头页尾 输出A4格式PDF 支持单页、多页输出 效果预览:查看演示PDFdemo地址:demo…

    数据库 2023年6月11日
    099
  • 关于SQL语句的执行顺序

    首先,要清楚在一select语句中都会用到哪些关键字: 其次,要知道每执行一步就会生成一个对应的虚拟表: 了解这两点,然后看看执行的顺序。 [En] Understand thes…

    数据库 2023年5月24日
    070
  • 手写spring的ioc的流程截图(笔记-1)

    spring ioc是什么? IoC 容器是 Spring 的核心,也可以称为 Spring 容器。Spring 通过 IoC 容器来管理对象的实例化和初始化,以及对象从创建到销毁…

    数据库 2023年6月6日
    064
  • MySQL8自增主键变化

    MySQL8自增主键变化 醉后不知天在水,满船清梦压星河。 一、简述 MySQL版本从5直接大跃进到8,相信MySQL8一定会有很多令人意想不到的改进,如果不想只会CRUD可以看看…

    数据库 2023年5月24日
    066
  • SpringBoot自定义环境变量——EnvironmentPostProcessor

    现有需求是将数据库配置文件中账号密码相关信息分离且加密,用到了SpringBoot中 EnvironmentPostProcessor接口。可以将外部配置文件读取注入系统中。 实现…

    数据库 2023年6月16日
    087
  • Golang context

    Context Go 语言中提供了 context 包,通过显示传递 context, 实现请求级别的元数据、取消信号、终止信号的传递。context 包提供了从现有的上下文值(c…

    数据库 2023年6月16日
    077
  • gitlab-runner浅谈——【git fetch-pack: expected shallow list】解决方法

    配置完gitlab-runner后执行job总是失败,如下: 解决方法 分析原因发现是git的版本太低了,我用的是系统自带的1.8.3的版本。后来更新为:2.31.1 后job可以…

    数据库 2023年6月11日
    070
  • MySQL知识点大全!!

    使用PreStatement对象: public int execUpdate(String sql, Object[] parms) { int count = 0; try {…

    数据库 2023年5月24日
    074
  • my2sql工具之快速入门

    GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源。 GreatSQL是MySQL的国产分支版本,使用上与MySQL一致。 my2sql工具之快速入门 1….

    数据库 2023年5月24日
    083
  • JavaWeb 05_JDBC入门及连接MySQL

    一、概念 *概念: Java DataBase Connectivity Java数据库连接, Java语言操作数据库* JDBC本质:其实是官方(sun公司)定义的一套操作所有关…

    数据库 2023年5月24日
    094
  • Linux中的grep,sed,find的使用方法

    提取指定文件到指定目录/文件 语法:tar xvf test.tar test1(只提取test.tar 包中的test1文件到当前路径) 语法:tar xvf test.tar …

    数据库 2023年6月16日
    070
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球