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

 

posted @ 2023-05-05 17:14  布衣梦蝶1978  阅读(17)  评论(0编辑  收藏  举报