小白个人博客---设计篇


小白 系列全部原创,不给初学者挖坑。。。。这也是写这个的目的

一。数据库设计

建表,建表。。。。

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