小白個人博客---設計篇


小白 系列全部原創,不給初學者挖坑。。。。這也是寫這個的目的

一。數據庫設計

建表,建表。。。。

1.用戶,沒人不行。。

關鍵item :用戶名,密碼

其他:郵箱,頭像,創建時間,粉絲

2.博客用戶表

關鍵是這個博客是誰的。。

其他:博客名字,地址。。。

3.文章

關鍵是哪個博客的文章

其他:文章標題,文章內容,評論,踩贊

二 .各表關系分析

1.用戶和粉絲:本質都是用戶,考慮自關聯,多對多關系

2.用戶和博客:一個用戶只能開一個博客,一對一關系

3.博客和文章:一篇文章(幾篇文章)只屬於一個博客,一對多

4.文章和文章的分類:一篇文章(幾篇文章)屬於某一個分類,一對多

5.文章和文章的標簽:一篇文章(幾篇文章)屬於某個或多個標簽,多對多

6.文章和評論:一篇文章有多個評論,一對多

7.評論和回復:一條評論可以有多個回復,一對多(咱先不考慮對回復再進行回復的情況)

三 干貨建表:

用戶表:

 1 from django.db import models
 2 class UserInfo(models.Model):
 3     """用戶表"""
 4     uid=models.BigAutoField(primary_key=True) #自增列,必須聲明primary_key=True
 5     username=models.CharField(max_length=32,unique=True,verbose_name="用戶名")
 6     password=models.CharField(max_length=64,verbose_name="密碼")
 7     nickname=models.CharField(max_length=32,verbose_name="昵稱",unique=True)
 8     email=models.EmailField(verbose_name="郵箱",unique=True)
 9     avatar=models.ImageField(verbose_name="頭像",upload_to="static/imgs")
10     create_time=models.DateTimeField(verbose_name="創建時間",auto_now_add=True)
11     fans=models.ManyToManyField(
12         verbose_name="粉絲們",
13         to="UserInfo",
14         through="UserFans",
15         through_fields=("user","follower")
16     )
17     def __str__(self):
18         return self.username
19     class Meta:
20         verbose_name_plural="用戶表"


class UserFans(models.Model):
user=models.ForeignKey(verbose_name="博主",to="UserInfo",to_field="uid",related_name="users",on_delete=models.CASCADE)
follower=models.ForeignKey(verbose_name="粉絲",to="UserInfo",to_field="uid",related_name="followers",on_delete=models.CASCADE)
class Meta:
unique_together=[
("user","follower"),
]
verbose_name_plural="互粉關系表"
 

小白解釋,大神繞道。。。

1.uid=models.BigAutoField(primary_key=True),等於建表時默認的id列,自增並且是primary key.這樣寫自己可以命名,還可以Big取值范圍擴大,但是必須聲明

primary_key=True.

2.verbose_name 是列名在admin 里面的顯示,相應的在db里面db_column="your_name"

verbose_name_plural 是表名在admin 里面的顯示。...db_table="your_db_table_name"

3.fans,多對多,所以 創建第三張關系表。

多對多本質是通過第三張表來查詢另外二張表的關系:

所以第三張表的item必須和另外二張表的primary_key 是ForeignKey關系,並且聯合唯一,即共同組成第三張表的primary_key:through_fields=("user","follower").

 

博客表:

 
class Blog(models.Model):
    """博客信息"""
    bid=models.BigAutoField(primary_key=True)
    title=models.CharField(verbose_name="個人博客標題",max_length=64)
    site=models.CharField(verbose_name="個人博客前綴",max_length=32,unique=True)
    theme=models.CharField(verbose_name="博客主題",max_length=32)
    user=models.OneToOneField(to="UserInfo",to_field="uid",on_delete=models.CASCADE)#foreign key unique=true
    def __str__(self):
        return self.title

 

小白解釋,大神繞道。。。
一個用戶只有一個博客。OneToOneFileld,本質還是ForeignKey,但是此列數據不能重復即unique=true

文章表:
class Article(models.Model):
    nid=models.BigAutoField(primary_key=True)
    title=models.CharField(verbose_name="文章標題",max_length=64)
    summary=models.CharField(verbose_name="文章簡介",max_length=255)
    content=models.TextField(verbose_name="文章內容")
    read_count=models.IntegerField(default=0)
    comment_count=models.IntegerField(default=0)
    up_count=models.IntegerField(default=0)
    down_count=models.IntegerField(default=0)
    create_time=models.DateTimeField(verbose_name="創建時間",auto_now_add=True)
    blog=models.ForeignKey(verbose_name="所屬博客",to="Blog",to_field="bid",on_delete=models.CASCADE)
    category=models.ForeignKey(verbose_name="文章類型",to="Category",to_field="nid",null=True,on_delete=models.CASCADE)
  
    type_choices=[
        (1,"Python"),
        (2,"Linux"),
        (3,"OpenStack"),
        (4,"GoLang"),
    ]
    article_type_id=models.IntegerField(choices=type_choices,default=None)
    tags=models.ManyToManyField(
        to="Tag",
        through="Article2Tag",
        through_fields=("article","tag")
    )
    def __str__(self):
        return self.title
 
        

model.CharField(),必須提供max_length=.123...

content:使用TextField,放置大量文本

一篇article 需要設定屬於哪個blog,即ForeignKey blog表

同理Category.

Tag 和article 是多對多關系,需要第三張表。

標簽表和第三張表:

class Tag(models.Model):
    nid=models.BigAutoField(primary_key=True)
    title=models.CharField(verbose_name="標簽名稱",max_length=32)
    blog=models.ForeignKey(verbose_name="所屬博客",to="Blog",to_field="bid",on_delete=models.CASCADE)
    def __str__(self):
        return self.title


class Article2Tag(models.Model):
    article=models.ForeignKey(verbose_name="文章",to="Article",to_field="nid",on_delete=models.CASCADE)
    tag=models.ForeignKey(verbose_name="標簽",to="Tag",to_field="nid",on_delete=models.CASCADE)
    class Meta:
        unique_together=[
            ("article","tag"),
        ]

分類表:

class Category(models.Model):
    """
    博主個人文章分類   
    """
    nid=models.BigAutoField(primary_key=True)
    title=models.CharField(verbose_name="分類標題",max_length=32)
    blog=models.ForeignKey(verbose_name="所屬博客",to="Blog",to_field="bid",on_delete=models.CASCADE)
    def __str__(self):
        return self.title

 

注意因為分類,標簽都是博主個人自建的,所以創建時需要有所屬blog信息,即是誰創建的。

 

踩贊表:

class UpDown(models.Model):
    """菜贊"""
    article=models.ForeignKey(verbose_name="文章",to="Article",to_field="nid",on_delete=models.CASCADE)
    user=models.ForeignKey(verbose_name="誰贊或菜的",to="UserInfo",to_field="uid",on_delete=models.CASCADE)
    up_down=models.BooleanField(verbose_name="是否贊")
    class Meta:
        unique_together=[
            ("article","user"),#一個用戶不能多次點贊
        ]

此表用來記錄某一篇article被那個user,踩或贊過。注意一點:表記錄不能值不能重復。

 

評論表:

class Comment(models.Model):
    """用戶評論"""
    nid=models.BigAutoField(primary_key=True)
    content=models.CharField(verbose_name="評論內容",max_length=255)
    create_time=models.DateTimeField(verbose_name="創建時間",auto_now_add=True)
    article=models.ForeignKey(verbose_name="評論文章",to="Article",to_field="nid",on_delete=models.CASCADE)
    user=models.ForeignKey(verbose_name="評論者",to="UserInfo",to_field="uid",on_delete=models.CASCADE)

此表用來記錄article,被哪個user評論過

回復表:

class Reply(models.Model):
    nid=models.BigAutoField(primary_key=True)
    reply_content=models.CharField(verbose_name="回復內容",max_length=255)
    reply_comment=models.ForeignKey(verbose_name="對那條評論",to="Comment",to_field="nid",on_delete=models.CASCADE)
    article = models.ForeignKey(verbose_name="評論文章", to="Article", to_field="nid", on_delete=models.CASCADE)
    user = models.ForeignKey(verbose_name="評論者", to="UserInfo", to_field="uid", on_delete=models.CASCADE)

記錄某一個評論被哪個user回復,回復內容,當然是建立在article的基礎上的。

先有article,再有comment ,再有reply.

 

至此,表就建立完了。。。。。。。。。。。。。。

下一篇在django admin 里面看一下效果。

 

 

 

 

 

 



 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM