Models 表模型
from django.contrib.auth.models import AbstractUser
class User(AbstractUser):
"""
用户表:User
username:账号
password:密码
data_joined:注册时间
avatar:图像
telephone:电话
blog:博客站点(一对一)
"""
avatar = models.FileField(upload_to='avatar/', default="static/img/user.png") # upload_to自动生成存文件的地方,mysql只会存路径
telephone = models.CharField(max_length=11)
blog = models.OneToOneField(to="Blog", null=True, on_delete=models.SET_NULL, db_constraint=False) # 用于与站点一对一
def __str__(self):
return self.username
class Blog(models.Model):
"""
博客站点表:Blog
name:站点名
title:标题
theme:站点主体样式
category:拥有的分类(多对多)
tag: 拥有的标签(多对多)
"""
site = models.CharField(max_length=32, unique=True)
name = models.CharField(max_length=32)
title = models.CharField(max_length=64)
theme = models.CharField(max_length=128)
category = models.ManyToManyField(to="Category", db_constraint=False) # 站点与分类多对多 通过第三表连接
tag = models.ManyToManyField(to="Tag", db_constraint=False) # 站点与标签多对多 通过第三表连接
def __str__(self):
return self.name
class Category(models.Model):
# 分类表:Category
# name:分类名
name = models.CharField(max_length=32, unique=True)
def __str__(self):
return self.name
class Tag(models.Model):
# 标签表:Tag
# name:标签名
name = models.CharField(max_length=32,unique=True)
def __str__(self):
return self.name
class Article(models.Model):
# title:文章标题
# desc:文章摘要
# content:文章内容
# create_time:发布时间
# blog:所属博客站点(一对多)
# category:所属分类(一对多)
# tag:拥有的标签(多对多)
title = models.CharField(max_length=64)
desc = models.CharField(max_length=256)
# content = models.TextField() # 不经常差的提取出来,加快查询
create_time = models.DateField(auto_now_add=True)
blog = models.ForeignKey(to="Blog",null=True,on_delete=models.SET_NULL,db_constraint=False) # 站点与文章一对多
# category = models.ForeignKey(to="Category",null=True,on_delete=models.SET_NULL,db_constraint=False) # 分类与文章一对多
# tag = models.ManyToManyField(to="Tag", db_constraint=False) # 文章与标签多对多
article_detail = models.OneToOneField(to="ArticleDetail",
null=True, on_delete=models.SET_NULL, db_constraint=False, blank=True)
up_count = models.IntegerField(default=0) # 点赞数
down_count = models.IntegerField(default=0) # 点踩数
comment_count = models.IntegerField(default=0)
def __str__(self):
return self.title
# 对文章表抽取不常用字段,加快查询
class ArticleDetail(models.Model):
content = models.TextField()
category = models.ForeignKey(to="Category", null=True,on_delete=models.SET_NULL, db_constraint=False) # 分类与文章一对多
tag = models.ManyToManyField(to="Tag", db_constraint=False) # 文章与标签多对多
# def __str__(self):
# return self.category
class UpOrDown(models.Model):
# user:点赞点踩用户(一对多)
# article:点赞点踩文章(一对多)
# is_up:点赞或点踩
user = models.ForeignKey(to="User", null=True, on_delete=models.SET_NULL, db_constraint=False)
article = models.ForeignKey(to="Article", null=True, on_delete=models.SET_NULL, db_constraint=False)
is_up = models.BooleanField()
def __str__(self):
return self.user.username + " | " + self.article.title + ">>>" + str(self.is_up)
# 实际开发这种表存在大量的修改操作,不建议建立索引(索引服务于查询的)
class Meta: # 元信息
unique_together = ('user', 'article')
verbose_name = "赞踩"
verbose_name_plural = verbose_name
class Common(models.Model):
# 评论表:Common
# user:评论者(一对多)
# article:评论文章(一对多)
# content:评论内容
# parent:父评论(自关联)
user = models.ForeignKey(to="User",null=True, on_delete=models.SET_NULL, db_constraint=False)
article = models.ForeignKey(to="Article",null=True, on_delete=models.SET_NULL, db_constraint=False)
content = models.TextField()
parent = models.ForeignKey(to="self",null=True, on_delete=models.SET_NULL, db_constraint=False) # 自关联
def __str__(self):
return str(self.user.id) + "" + str(self.article.id) + "" + str(self.parent)
class Meta:
verbose_name = "评论"
verbose_name_plural = verbose_name