小白 系列全部原创,不给初学者挖坑。。。。这也是写这个的目的
一。数据库设计
建表,建表。。。。
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 里面看一下效果。