视频加载失败

BBS模型表创建

1750 字
9 分钟
BBS模型表创建

【零】创建公共表#

  • lib/CommonModel.py
from django.db import models
class CommonModel(models.Model):
create_time = models.DateTimeField(auto_now_add=True, verbose_name="创建时间")
update_time = models.DateTimeField(auto_now=True, verbose_name="更新时间")
class Meta:
# 抽象模型类不能创建表
abstract = True

【一】创建用户表#

【1】创建模型表#

  • user/models.py
from django.db import models
from lib import CommonModel
# Create your models here.
'''
先写普通字段
再写外键字段
'''
from django.contrib.auth.models import AbstractUser
# 用户表
class UserInfo(AbstractUser, CommonModel):
phone = models.BigIntegerField(verbose_name="手机号", help_text="手机号", null=True, blank=True)
'''
null=True 数据库该字段可以为空
blank=True admin后台管理可以为空
'''
# 静态文件 static 写法 : 上传文件至项目的根目录下的 static 文件夹下
# 依赖于 Pillow 模块 : python -m pip install Pillow
# avatar = models.FileField(verbose_name="用户头像", help_text="用户头像",
# upload_to='static/avatar/', default='static/avatar/default.png')
# 给avatar字段传文件对象,该文件会自动存储到 avatar 文件夹下,然后avatar字段只保存文件路径 例如 avatar/default.png(不上传文件的默认头像文件)
# 更新 media 写法 : 上传文件至项目的根目录下的media 文件夹下
avatar = models.FileField(verbose_name="用户头像", help_text="用户头像",
upload_to='avatar/', default='static/avatar/default.png')
is_deleted = models.BooleanField(verbose_name="逻辑删除", help_text="逻辑删除", default=False)
# 用户关联个人站点
# 一对一关系:一个用户只能有一个个人站点,一个个人站点只能对应一个用户
blog = models.OneToOneField(verbose_name="关联博客", to="blog.Blog", on_delete=models.CASCADE, null=True)
# 配置数据库元信息
class Meta:
# 指定数据库在后台显示的名字
verbose_name = "用户表"
verbose_name_plural = verbose_name
# 指定当前模型表在数据库中的表名
db_table = "userinfo"
# 默认以当前用户名返回
def __str__(self):
return self.username

【2】指定默认用户模型表#

  • 配置文件修改指定 User 表
# 默认用户模型指定
AUTH_USER_MODEL = 'book.UserInfo'

【二】创建站点表#

  • blog/models.py
from django.db import models
from lib import CommonModel
# Create your models here.
# 个人站点表
class Blog(CommonModel):
site_name = models.CharField(verbose_name="站点名称", help_text="站点名称", max_length=32)
site_title = models.CharField(verbose_name="站点标题", help_text="站点标题", max_length=32)
site_theme = models.CharField(verbose_name="站点样式", help_text="站点样式", max_length=64) # css/js的文件路径
# 配置数据库元信息
class Meta:
# 指定数据库在后台显示的名字
verbose_name = "个人站点表"
verbose_name_plural = verbose_name
# 指定数据库在后台显示的表名
db_table = "blog"
# 默认以当前站点名称返回
def __str__(self):
return self.site_name
# 广告信息表
class Adv(CommonModel):
title = models.CharField(verbose_name="广告标题", help_text="广告标题", max_length=64)
content = models.TextField(verbose_name="广告详细内容", help_text="广告详细内容")
create_time = models.DateTimeField(verbose_name="创建时间", help_text="创建时间", auto_now=True)
update_time = models.DateTimeField(verbose_name="更新时间", help_text="更新时间", auto_now_add=True)
mobile = models.CharField(verbose_name="手机号", help_text="手机号", max_length=11,
default="", blank=True)
# 静态文件 static 写法 : 上传文件至项目的根目录下的 static 文件夹下
# img = models.ImageField(verbose_name="广告图片", help_text="广告图片",
# upload_to="static/advImg/", default="/static/advImg/default.jpg")
# 更新 media 写法 : 上传文件至项目的根目录下的media 文件夹下
img = models.ImageField(verbose_name="广告图片", help_text="广告图片",
upload_to="advImg/%Y-%m", default="/static/advImg/default.jpg")
is_background_img = models.BooleanField(verbose_name="是否为轮播图", help_text="是否为轮播图", default=False)
# 配置数据库元信息
class Meta:
# 数据库名字
db_table = "adv"
# 指定数据库在后台显示的名字
verbose_name = '广告信息表'
verbose_name_plural = verbose_name

【三】创建文章相关表#

  • article/models.py
from django.db import models
from lib import CommonModel
# Create your models here.
# 文章表
class Article(CommonModel):
title = models.CharField(verbose_name="文章标题", max_length=64)
desc = models.CharField(verbose_name="文章简介", max_length=255)
content = models.TextField(verbose_name="文章内容")
# create_time
# update_time
# 数据库字段设计优化
up_num = models.BigIntegerField(verbose_name="点赞数", default=0)
down_num = models.BigIntegerField(verbose_name="点踩数", default=0)
comment_num = models.BigIntegerField(verbose_name="评论数", default=0)
# 文章关联个人站点
# 一对多关系:一篇文章只能对应一个个人站点,但是一个个人站点可以有多篇文章
blog = models.ForeignKey(verbose_name="关联博客", to="blog.Blog", on_delete=models.CASCADE, null=True)
# 文章关联文章分类
# 多对一关系:一篇文章可以对应一个分类,但是一个分类下可以有多篇文章
category = models.ForeignKey(verbose_name="关联分类", to="CategoryClass", on_delete=models.CASCADE, null=True)
# 文章关联文章标签
# 多对多关系:一篇文章可以对应多个标签,一个标签下可以有多篇文章
tags = models.ManyToManyField(verbose_name="关联文章和标签", to="CategoryTag",
through='ArticleToTag', through_fields=("article", "tag"))
# 定义数据库元信息
class Meta:
# 数据库表名
db_table = "article"
# admin后台显示的表名称
verbose_name = "文章表"
verbose_name_plural = verbose_name
# 默认以当前文章名称返回
def __str__(self):
return self.title
# 文章分类表
class CategoryClass(CommonModel):
name = models.CharField(verbose_name="文章分类", max_length=32)
# 文章分类关联个人站点
# 一对多关系:一个文章分类只能对应一个个人站点,但是一个个人站点可以有多个文章分类
blog = models.ForeignKey(verbose_name="关联博客", to="blog.Blog", on_delete=models.CASCADE, null=True)
# 配置数据库元信息
class Meta:
# 数据库表名
db_table = "category_class"
# 后台管理显示的名称
verbose_name = "文章分类表"
verbose_name_plural = verbose_name
# 默认以当前文章名返回
def __str__(self):
return self.name
# 文章标签表
class CategoryTag(CommonModel):
name = models.CharField(verbose_name="文章标签", max_length=32)
blog = models.ForeignKey(verbose_name="文章标签关联个人站点mi", to="blog.Blog",
null=True, blank=True, on_delete=models.CASCADE)
# 配置数据库元信息
class Meta:
# 数据库表名
db_table = "category_tag"
# 后台管理显示的名称
verbose_name = "文章标签表"
verbose_name_plural = verbose_name
# 默认以当前文章标签名返回
def __str__(self):
return self.name
# 创建关联表,用于存储文章和标签的关联关系(多对多关系)
class ArticleToTag(CommonModel):
article = models.ForeignKey(verbose_name="关联文章", to="Article", on_delete=models.CASCADE, null=True)
tag = models.ForeignKey(verbose_name="关联标签", to="CategoryTag", on_delete=models.CASCADE, null=True)
# 定义数据库元信息
class Meta:
# 数据库表名
db_table = "article_to_tag"
# admin后台显示的表名称
verbose_name = "文章关联标签"
verbose_name_plural = verbose_name
# 点赞点踩表
class UpAndDown(CommonModel):
# 关联用户对象
# 多对一关系:一篇文章可以对应多个用户,一个用户可以对多篇文章进行点赞点踩
user = models.ForeignKey(verbose_name="关联用户", to='user.UserInfo', on_delete=models.CASCADE)
# 关联文章对象
article = models.ForeignKey(verbose_name="关联文章", to='Article', on_delete=models.CASCADE)
# 点赞点踩状态
up_or_down = models.BooleanField(verbose_name="是否点赞点踩")
# create_time
# update_time
# 定义数据库元信息
class Meta:
# 数据库表名
db_table = "up_and_down"
# admin后台显示的表名称
verbose_name = "点赞点踩表"
verbose_name_plural = verbose_name
# 评论表
class Comment(CommonModel):
# 关联用户对象
# 多对一关系:一篇文章可以对应多个用户,一个用户可以对多篇文章进行评论
user = models.ForeignKey(verbose_name="关联用户", to='user.UserInfo', on_delete=models.CASCADE)
# 关联文章对象
# 多对一关系:一篇文章可以对应多个评论,一个评论只能对应一篇文章
article = models.ForeignKey(verbose_name="关联文章", to='Article', on_delete=models.CASCADE)
# 评论内容
content = models.CharField(verbose_name="评论内容", max_length=255)
# 评论的父评论 , 有些评论就是根评论
parent = models.ForeignKey(verbose_name="自关联主评论", to="self", on_delete=models.CASCADE, null=True, blank=True)
is_deleted = models.BooleanField(verbose_name="是否删除评论,假删除", default=False)
# create_time
# update_time
# 定义数据库元信息
class Meta:
# 数据库表名
db_table = "comment"
# admin后台显示的表名称
verbose_name = "用户评论表"
verbose_name_plural = verbose_name

【四】迁移数据库#

【1】生成迁移文件#

Terminal window
python manage.py makemigrations

【2】迁移记录生效#

Terminal window
python manage.py migrate

支持与分享

如果这篇文章对你有帮助,欢迎分享给更多人或打赏支持!

打赏
Profile Image of the Author
Dream
Hello, I'm Dream.
公告
欢迎来到我的博客!爱学习爱进步。
分类
标签
最新动态
站点统计
文章
169
分类
3
标签
26
总字数
334,507
运行时长
0 天
最后活动
0 天前
站点信息
构建平台
Vercel
博客版本
Firefly v6.16.8
文章许可
CC BY-NC-SA 4.0
文章目录