1. 程式人生 > 其它 >Django——開發類似部落格園的部落格系統之模型設計

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