目录配置设置 创表 数据库迁移
BBS项目类似于博客园 核心:文章的增删改查
一、表分析
用户表
个人站点表
文章表
文章分类表
文章标签表
点赞点菜表
文章评论表
二、基础字段分析
# 1.用户表
替换auth_user表
电话号码
用户头像
注册时间
# 2.个人站点表
站点名称
站点标题
站点样式
# 3.文章表
文章标题
文章简介
文章内容
发布时间
# 4.文章分类表
分类名称
# 5.文章标签表
标签名称
# 6.点赞点踩表:记录哪个用户给哪篇文章点了推荐(赞)还是反对(踩)
用户字段(用户主键)>>>:外键字段
文章字段(文章主键)>>>:外键字段
点赞点踩
# 7.文章评论表:记录哪个用户给哪篇文章评论了什么内容
用户字段(用户主键)>>>:外键字段
文章字段(文章主键)>>>:外键字段
评论内容
评论时间
三、外键字段分析
四、创建项目以及配置设置步骤
创建django项目
修改配置[os.path.join(BASE_DIR, 'templates')]
项目根目录下创建static目录
在配置文件里写STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')]
在配置文件里写AUTH_USER_MODEL = 'app01.UserInfo' # 替换了auth_user表
在终端创数据库
在配置文件里修改数据库相关配置
在models.py文件里编写创表的ORM代码
进行数据库迁移
链接数据库
五、创建表的所有代码如下
from django.db import models
from django.contrib.auth.models import AbstractUser
# Create your models here.
class UserInfo(AbstractUser):
"""1.用户表"""
phone = models.BigIntegerField(verbose_name='手机号', null=True, blank=True) # blank参数用于控制admin后台管理与数据库无关
avatar = models.FileField(verbose_name='用户头像', upload_to='avatar/', default='avatar/default.jpg')
register_time = models.DateTimeField(verbose_name='注册时间', auto_now_add=True)
# 用户表与个人站点表一对一外键字段(因为用户表的查询频率较高 所以在用户表里创建)
site = models.OneToOneField(to='site', on_delete=models.CASCADE, null=True)
# 修改admin后台管理的表名
class Meta:
verbose_name_plural = '用户表'
def __str__(self):
return f'用户对象:{self.username}'
class Site(models.Model):
"""2.个人站点表"""
site_name = models.CharField(verbose_name='站点名称', max_length=32)
site_title = models.CharField(verbose_name='站点标题', max_length=32)
site_theme = models.CharField(verbose_name='站点样式', max_length=32, null=True)
class Meta:
verbose_name_plural = '个人站点表'
def __str__(self):
return f'个人站点对象:{self.site_name}'
class Article(models.Model):
"""3.文章表"""
title = models.CharField(verbose_name='文章标题', max_length=32)
desc = models.CharField(verbose_name='文章简介', max_length=255)
content = models.TextField(verbose_name='文章内容', )
create_time = models.DateTimeField(verbose_name='创建时间', auto_now_add=True)
# 三个优化字段
comment_num = models.IntegerField(verbose_name='评论数', default=0)
up_num = models.IntegerField(verbose_name='点赞数', default=0)
down_num = models.IntegerField(verbose_name='点踩数', default=0)
# 外键
site = models.ForeignKey(to='Site', on_delete=models.CASCADE, null=True)
category = models.ForeignKey(to='Category', on_delete=models.CASCADE, null=True)
tags = models.ManyToManyField(to='Tag',
through='Article2Tag',
through_fields=('article', 'tag'),
null=True
)
class Meta:
verbose_name_plural = '文章表'
def __str__(self):
return f'文章对象:{self.title}'
class Tag(models.Model):
"""5.文章标签表"""
name = models.CharField(verbose_name='标签名称', max_length=32)
site = models.ForeignKey(to='Site', on_delete=models.CASCADE, null=True)
class Meta:
verbose_name_plural = '文章标签表'
def __str__(self):
return f'文章标签对象:{self.name}'
class Category(models.Model):
"""4.文章分类表"""
name = models.CharField(verbose_name='分类名称', max_length=32)
site = models.ForeignKey(to='Site', on_delete=models.CASCADE, null=True)
class Meta:
verbose_name_plural = '文章分类表'
def __str__(self):
return f'文章分类对象:{self.name}'
class Article2Tag(models.Model):
"""文章标与标签表的多对多第三张关系表(半自动创建方式)"""
article = models.ForeignKey(to='Article', on_delete=models.CASCADE, null=True)
tag = models.ForeignKey(to='Tag', on_delete=models.CASCADE, null=True)
class UpAndDown(models.Model):
"""6.文章点赞点踩表"""
user = models.ForeignKey(to='UserInfo', on_delete=models.CASCADE, null=True)
article = models.ForeignKey(to='Article', on_delete=models.CASCADE, null=True)
is_up = models.BooleanField(verbose_name='点赞点踩') # 传布尔值存 0或1
class Meta:
verbose_name_plural = '文章点赞点踩表'
def __str__(self):
return f'文章点赞点踩对象:{self.user}'
class Comment(models.Model):
"""7.文章评论表"""
user = models.ForeignKey(to='UserInfo', on_delete=models.CASCADE, null=True)
article = models.ForeignKey(to='Article', on_delete=models.CASCADE, null=True)
content = models.TextField(verbose_name='评论内容')
comment_time = models.DateTimeField(verbose_name='评论时间', auto_now_add=True)
parent = models.ForeignKey(to='self', on_delete=models.CASCADE, null=True)
class Meta:
verbose_name_plural = '文章评论表'
def __str__(self):
return f'文章评论对象:{self.user}'
六、项目开发基本流程
-
需求分析
-
架构设计
-
分组开发
-
提交测试
-
交付上线