2.数据库表设计及其创建
表设计
# 1.用户表 继承AbstractUser 字段 phone(用户手机号) avatar(用户头像) create_time(创建时间) 外键字段 一对一个人站点表 # 2.个人站点表 字段 site_name(站点名称) site_title(站点标题) site_theme(站点样式(用来存放css文件)) # 3.文章标签表(一篇文章可以有多个标签) 字段 name(文章标签名(后面的数字是动态算出来的)) 外键字段 一对多个人站点 # 4.文章分类表(一篇文章只能有一种分类) 字段 name(分类名) 外键字段 一对多个人站点 # 5.文章表 字段 title(文章标题) desc(文章摘要) content(文章内容) create_time(发布时间) 数据库优化设计(******) 虽然下述的三个字段可以从其他表里通过跨表查询计算出来,但是频繁跨表效率低 up_num(点赞数) down_num(点踩数) comment_num(评论数) 外键字段 一对多个人站点 多对多文章标签 一对多文章分类 # 6.点赞点踩表(记录哪个用户给哪篇文章点赞了还是点踩了) user(用户) ForeignKey(to="User") article(文章) ForeignKey(to="Article") is_up(是否点赞) BooleanField() 1 1 1 1 2 1 1 3 0 2 1 1 # 7.文章评论表(记录哪个用户给哪篇文章评论了哪些内容) user(用户) ForeignKey(to="User") article(文章) ForeignKey(to="Article") content(内容) CharField() comment_time(评论时间) DateField() # 自关联 parent() ForeignKey(to="Comment",null=True) # ORM专门提供的自关联写法 parent() ForeignKey(to="self",null=True) user_id article_id parent_id 1 1 1 2 2 1 根评论子评论的概念 跟评论就是直接评论当前发布的内容 子评论就是评论别人的评论 1 PHP是世界上最强大的语言 1.1 python才是世界上最强大的语言 1.2 java才是世界上最强大的语言 # 跟评论与子评论是一对多的关系
表创建
准备工作
- 由于UserInfo表继承了AbstractUser表,所以要在配置文件中配置
- 由于需要使用用户的头像
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
from django.db import models # Create your models here. from django.contrib.auth.models import AbstractUser class UserInfo(AbstractUser): phone = models.BigIntegerField(null=True, verbose_name='手机号') avatar = models.FileField(upload_to='avatar/', default='avatar/default.png', verbose_name='用户头像') # 给avatar字段传文件对象,该文件会自动存储在avatar文件夹下,avatar字段只保存文件路径(avatar/default.png) create_time = models.DateField(auto_now_add=True, verbose_name='创建时间') Blog = models.OneToOneField(to='Blog', on_delete=models.CASCADE, null=True) class Blog(models.Model): site_name = models.CharField(max_length=32, verbose_name='站点名称') site_title = models.CharField(max_length=32, verbose_name='站点标题') site_theme = models.CharField(max_length=64, verbose_name='站点样式') # 存css/js文件路径 class Category(models.Model): name = models.CharField(max_length=32, verbose_name='标签名') blog = models.ForeignKey(to='Blog', on_delete=models.CASCADE, null=True) class Tag(models.Model): name = models.CharField(max_length=32, verbose_name='分类名') blog = models.ForeignKey(to='Blog', on_delete=models.CASCADE, null=True) class Article(models.Model): title = models.CharField(max_length=32, verbose_name='文章标题') desc = models.CharField(max_length=255, verbose_name='文章摘要') content = models.TextField(verbose_name='文章内容') # 文章内容有很多,一般情况下都是用TextField create_time = models.DateField(auto_now_add=True, verbose_name='文章创建时间') # 数据库字段优化设计 up_num = models.BigIntegerField(default=0, verbose_name='点赞数') down_num = models.BigIntegerField(default=0, verbose_name='点踩数') comment_num = models.BigIntegerField(default=0, verbose_name='评论数') blog = models.ForeignKey(to='Blog', on_delete=models.CASCADE, null=True) category = models.ForeignKey(to='Category', on_delete=models.CASCADE, null=True) tags = models.ManyToManyField(to='Tag', through='ArticleAndTag', through_fields=('article', 'tag') ) class ArticleAndTag(models.Model): article = models.ForeignKey(to='Article', on_delete=models.CASCADE) tag = models.ForeignKey(to='Tag', on_delete=models.CASCADE) class UpAndDown(models.Model): user = models.ForeignKey(to='UserInfo', on_delete=models.CASCADE) article = models.ForeignKey(to='Article', on_delete=models.CASCADE) is_up = models.BooleanField() # 传布尔值,存0/1 class Comment(models.Model): user = models.ForeignKey(to='UserInfo', on_delete=models.CASCADE) article = models.ForeignKey(to='Article', on_delete=models.CASCADE) content = models.CharField(max_length=256, verbose_name='评论内容') comment_time = models.DateTimeField(auto_now_add=True, verbose_name='评论时间') # 自关联 parent = models.ForeignKey(to='self', null=True, on_delete=models.CASCADE) # 有些评论就是根评论