小白 系列全部原創,不給初學者挖坑。。。。這也是寫這個的目的
一。數據庫設計
建表,建表。。。。
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 里面看一下效果。