Django——开发类似博客园的博客系统之模型设计
from django.db import models from django.contrib.auth.models import AbstractUser #扩展Django自带的User表,补充自己需要的字段,以后不会再生成auth_user表,而是生成自己定义的表 #此处要注意:需要告诉Django我要使用自己定义的用户表,settings中配置:AUTH_USER_MODEL = "blog_app.UserInfo" class UserInfo(AbstractUser): ''' 用户信息 ''' nid = models.AutoField(primary_key=True) telephone = models.CharField(max_length=11,null=True,unique=True) #用户的手机号 avatar = models.FileField(upload_to='avatars/',default='/avatars/default.png') #用户头像 create_time = models.DateTimeField(auto_now_add=True,verbose_name='创建时间') #用户的创建时间 blog = models.OneToOneField(to='Blog',to_field='nid',null=True,on_delete=models.DO_NOTHING) #每个用户的个人站点 def __str__(self): return self.username #用户的博客信息表,或者说是每个用户的个人站点表 class Blog(models.Model): nid = models.AutoField(primary_key=True) title = models.CharField(max_length=64,verbose_name='个人博客标题') site_name = models.CharField(max_length=64,verbose_name='站点标题') theme = models.CharField(max_length=32,verbose_name='博客主题') def __str__(self): return self.title
#博主个人的文章分类表 class Category(models.Model): nid = models.AutoField(primary_key=True) title = models.CharField(max_length=32,verbose_name='分类标题') blog = models.ForeignKey(to='Blog',to_field='nid',verbose_name='所属博客',on_delete=models.DO_NOTHING) def __str__(self): return self.title #博主个人的标签表 class Tag(models.Model): nid = models.AutoField(primary_key=True) title = models.CharField(max_length=32, verbose_name='标签标题') blog = models.ForeignKey(to='Blog', to_field='nid', verbose_name='所属博客',on_delete=models.DO_NOTHING) def __str__(self): return self.title
#博主个人的文章表 class Article(models.Model): nid = models.AutoField(primary_key=True) title = models.CharField(max_length=50,verbose_name='文章标题') desc = models.CharField(max_length=255,verbose_name='文章描述') create_time = models.DateTimeField(auto_now_add=True,verbose_name='创建时间') user = models.ForeignKey(to='UserInfo',to_field='nid',verbose_name='作者',on_delete=models.DO_NOTHING) #一个用户发表多篇文章 category = models.ForeignKey(to='Category',to_field='nid',null=True,on_delete=models.DO_NOTHING) #一个分类有多篇文章 tags = models.ManyToManyField( #标签和文章多对多 to='Tag', through='Article2Tag', #第三张表 through_fields=('article','tag') #第三张表的字段 ), content = models.TextField() comment_count = models.IntegerField(default=0) #评论数 up_count = models.IntegerField(default=0) #点赞数 down_count = models.IntegerField(default=0) #反对数 def __str__(self): return self.title
#自定义关联标签和文章的第三张表Article2Tag class Article2Tag(models.Model): nid = models.AutoField(primary_key=True) article = models.ForeignKey(to='Article',to_field='nid',verbose_name='文章',on_delete=models.DO_NOTHING) tag = models.ForeignKey(to='Tag',to_field='nid',verbose_name='标签',on_delete=models.DO_NOTHING) class Meta: unique_together = [ #联合唯一,这两个字段不能重复 ('article','tag'), ] def __str__(self): v = self.article.title + '---' + self.tag.title return v #文章点赞的表 class ArticleUpDown(models.Model): nid = models.AutoField(primary_key=True) user = models.ForeignKey(to='UserInfo',null=True,on_delete=models.DO_NOTHING) article = models.ForeignKey(to='Article',null=True,on_delete=models.DO_NOTHING) is_up = models.BooleanField(default=True) class Meta: unique_together = [ ('user','article'), ]
#评论表 class Comment(models.Model): nid = models.AutoField(primary_key=True) article = models.ForeignKey(to='Article',to_field='nid',verbose_name='评论的文章',on_delete=models.DO_NOTHING) user = models.ForeignKey(to='UserInfo',to_field='nid',verbose_name='评论者',on_delete=models.DO_NOTHING) content = models.TextField(max_length=255,verbose_name='评论内容') create_time = models.DateTimeField(auto_now_add=True,verbose_name='评论时间') parent_comment = models.ForeignKey(to='self',null=True,on_delete=models.DO_NOTHING) #父评论 def __str__(self): return self.content
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现