Django——开发类似博客园的博客系统之模型设计
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 | 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 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现