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)

大家都在看

  • Celery异步任务

    (1)安装celery pip install celery==4.2.1 (2)celery使用 在项目适当位置创建celery_tasks目录用于保存celery异步任务。 在…

    数据库 2023年6月14日
    081
  • CentOS 7 源码安装 Zabbix 6.0

    Zabbix 主要有以下几个组件组成: Zabbix Server:Zabbix 服务端,是 Zabbix 的核心组件。它负责接收监控数据并触发告警,还负责将监控数据持久化到数据库…

    数据库 2023年6月11日
    069
  • SQL Server2019安装

    检查.NET 环境 打开控制面板下面的程序,选择 启用或关闭 Wind…

    数据库 2023年6月6日
    099
  • 1_Maven

    一. 引言 1.1 项目管理问题 项目中jar包资源越来越多, jar包的管理越来越沉重 1.1.1 繁琐 要为每个项目手动导入所需的jar, 需要搜集全部的jar 1.1.2 复…

    数据库 2023年6月11日
    0101
  • mysql解压版简洁式本地配置方式

    1. 设置全局变量 解压mysql压缩包到指定位置, 然后配置全局变量, 在 path 中添加全局变量, 值为 mysql 根目录下 bin 目录路径, 比如: D:\code_s…

    数据库 2023年6月14日
    075
  • CSS进阶内容——布局技巧和细节修饰

    CSS进阶内容——布局技巧和细节修饰 我们在之前的文章中已经掌握了CSS的大部分内容,但仍有一些内容我们没有涉略,这篇文章就是为了补充前面没有涉及的内容,为我们的知识做出补充并且介…

    数据库 2023年6月14日
    083
  • Java架构师电商项目(220h):1-1 整体架构概述

    2022 Flag:学完这门 220h Java架构师电商项目视频课学习笔记将持续更新…… ; 大型网站特点 高并发 高可用 大数据 迭代周期短 用户量庞大…

    数据库 2023年6月6日
    093
  • 启用Hyper-v后,重启后界面提示 无法完成功能配置,正在撤销更改

    安装docker后,提示需要启用hyper-v,在控制面板中勾选Hyper-v,然后重启,更新快完成就提示无法完成功能配置,正在撤销更改 解决方法 方法1 控制面板一个一个选 方法…

    数据库 2023年6月14日
    0125
  • 解决Tomcat部署工件中无子模块的工件

    本文是在尝试了刷新Maven项目、clean了Maven缓存并且重启IDEA之后任然无法在Tomcat中找到子模块对应的工件,这时就要试着模仿着自己创建一个模块父类的pom.xml…

    数据库 2023年6月16日
    086
  • web监听器解析

    监听器是web三大组件之一,事件监听机制如下: 事件:某个事件,如果初始化上下文 事件源:事件发生的地方 监听器:一个对象,拥有需要执行的逻辑 注册监听:将事件、事件源、监听器绑定…

    数据库 2023年6月16日
    083
  • 学习笔记——Django项目中新增数据、修改数据

    2022-09-30 新增数据 方式一: 进入虚拟环境,进入shell工具环境中(”python manage.py shell”),插入数据。在插入数据之…

    数据库 2023年6月14日
    0104
  • [spring]spring静态代理和aop

    10.代理模式 代理模式的分类: 静态代理 动态代理 关系分析 抽象角色:一般会使用接口或者抽象类 真实角色:被代理的角色 代理角色:代理真实的角色,做一些附属的操作 客户:访问代…

    数据库 2023年6月16日
    095
  • django中批量插入数据

    1.什么是批量插入 在django中的orm给我们提供了一个bulk_create方法,批量创建插入数据! 2.为什么要使用批量插入 让我们首先来看看不使用大容量插入的情况: [E…

    数据库 2023年5月24日
    089
  • Java中CMD命令来备份mysql数据库备份文件出来为0字节问题

    Java中CMD命令来备份mysql&#…

    数据库 2023年5月24日
    0113
  • Java的值传递

    1. 形参和实参 实参(实际参数) :用于传递给函数/方法的参数,必须有确定的值。 形参(形式参数) :用于定义函数/方法,接收实参,不需要有确定的值 2. 值传递和引用传递 值传…

    数据库 2023年6月14日
    076
  • JSP中的EL 表达式

    JSP中的EL 表达式 什么是 EL 表达式,EL 表达式的作用? EL 表达式搜索域数据的顺序 EL 表达式输出 Bean 的普通属性,数组属性,List 集合属性,map 集合…

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