Django——開發類似部落格園的部落格系統之模型設計
阿新 • • 發佈:2021-09-13
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