BBS数据库设计

BBS数据库设计

一、BBS数据库设计

# models.py
from django.db import models

# Create your models here.
from django.contrib.auth.models import AbstractUser

class UserInfo(AbstractUser):
    """用户信息 blank=True)  # blank告诉django admin后台管理 该字段可以为空 """
    phone = models.BigIntegerField(null=True, blank=True)  # 用户手机号

    # upload_to 该字段用来存放用户上传头像的文件路径, 用户上传头像会自动放到avatar文件夹下面
    avatar = models.FileField(upload_to='avatar', default='avatar/default.png')  # 用户头像

    create_time = models.DateField(auto_now_add=True)  # 创建时间

    # 用户表与个人站点是一对一的关系
    blog = models.OneToOneField(to='Blog', null=True)

    class Meta:
        # 会在表名后面添加s
        # verbose_name = '用户表'
        verbose_name_plural = '用户表UserInfo'

    def __str__(self):
        return self.username


class Blog(models.Model):
    """个人站点"""
    site_name = models.CharField(max_length=55)  # 站点名称
    site_title = models.CharField(max_length=66)  # 站点标题
    # 存css. js 文件路径用于模板样式
    site_theme = models.CharField(max_length=200)  # 站点模板样式

    class Meta:
        # 会在表名后面添加s
        # verbose_name = '用户表'
        verbose_name_plural = '个人站点Blog'

    def __str__(self):
        return self.site_name


class Category(models.Model):
    """分类"""
    name = models.CharField(max_length=32)  # 分类名称

    # 个人站点与分类是一对多的关系
    blog = models.ForeignKey(to='Blog', null=True)  # 设置外键

    class Meta:
        # 会在表名后面添加s
        # verbose_name = '用户表'
        verbose_name_plural = '分类表Category'

    def __str__(self):
        return self.name

class Tag(models.Model):
    """标签"""
    name = models.CharField(max_length=32)  # 标签名称

    # 个人站点与分类是一对多的关系
    blog = models.ForeignKey(to='Blog', null=True)  # 设置外键

    class Meta:
        # 会在表名后面添加s
        # verbose_name = '用户表'
        verbose_name_plural = '标签Tag'

    def __str__(self):
        return self.name


class Article(models.Model):
    """文章信息"""
    title = models.CharField(max_length=64)  # 文章标题
    desc = models.CharField(max_length=255)  # 描述信息

    content = models.TextField()  # 存放大文本字段
    create_time = models.DateField(auto_now_add=True)  # 创建时间

    # 数据库优化,可以采用向表中添加需要的额外字段
    comment_num = models.BigIntegerField(default=0)  # 评论数据量
    up_num = models.BigIntegerField(default=0)  # 点赞个数
    down_num = models.BigIntegerField(default=0)  # 点彩个数

    # 外键字段

    # 个人站点和文章是一对多的关系
    blog = models.ForeignKey(to='Blog', null=True)

    # 分类和文章是一对多的关系, 一篇文章只能在一个分类下面,
    category = models.ForeignKey(to='Category', null=True)

    # 标签和文章是多对多的关系, 一片文章可以有多个标签对他进行定义
    # 第三张表可以添加额外的字段             创建的第三张表       在那个表中创建关系谁就在前面
    tag = models.ManyToManyField(to='Tag', through='ArticleTag', through_fields=('article', 'tag'))  # 可以天机

    class Meta:
        # 会在表名后面添加s
        # verbose_name = '用户表'
        verbose_name_plural = '文章Article'

    def __str__(self):
        return self.title


class ArticleTag(models.Model):
    """文章和标签的关系是多对多的关系"""
    article = models.ForeignKey(to='Article')
    tag = models.ForeignKey(to='Tag')

    class Meta:
        # 会在表名后面添加s
        # verbose_name = '用户表'
        verbose_name_plural = '多对多ArticleTag'


class UpAndDown(models.Model):
    """
    点赞,点彩表
     一张表中的一条数据能否对应另外一张表的多条数据
    另外一张表的一条数据能够对应当前的表多条件
      user_id        article_id               is_up
        1               1                           1
        1               2                           0
        1               3                           1
        2               1                           1
    """
    # 表关系
    # 用户和点赞点彩表是一对多关系
    user = models.ForeignKey(to='UserInfo')
    # 文章和点赞点彩表是一对多关系
    article = models.ForeignKey(to='Article')

    # 是否点赞或点彩
    is_up = models.BooleanField()  # 点赞,还是点彩

    class Meta:
        # 会在表名后面添加s
        # verbose_name = '用户表'
        verbose_name_plural = '点赞UpAndDown'

    def __str__(self):
        return self.is_up


class Comment(models.Model):
    # 表之间关系
    # 用户表和评论是一对多的关系
    user = models.ForeignKey(to='UserInfo')

    # 文章和评论是一对多的关系?
    article = models.ForeignKey(to='Article')

    content = models.CharField(max_length=255)
    create_time = models.DateTimeField(auto_now_add=True)

    # 添加外键字段, 一对多评论表   自关联 在评论时候可能会有子评论
    parent = models.ForeignKey(to='self', null=True)

    class Meta:
        # 会在表名后面添加s
        # verbose_name = '用户表'
        verbose_name_plural = '评论Comment'

    # def __str__(self):
    #     return self.is_up

二、Django后台管理数据

from django.contrib import admin
from app01 import models
# Register your models here.

# 将表注册在后台
admin.site.register(models.UserInfo)
admin.site.register(models.Blog)
admin.site.register(models.Category)
admin.site.register(models.Tag)
class ArticleConfig(admin.ModelAdmin):
    list_display = ['title','create_time']  # 配置展示字段
    list_display_links = ['title','create_time']  # 指定多个跳转标签
    search_fields = ['title']  # 指定查询  多个字段默认是or的关系

    def patch_init(self,queryset):
        pass
    patch_init.short_description = '批量更新'
    actions = [patch_init,]  # 自定义批量处理函数


    list_filter = ['tags','category']  # 定义外键字段的过滤


admin.site.register(models.Article,ArticleConfig)
admin.site.register(models.Article2Tag)
admin.site.register(models.Comment)
admin.site.register(models.UpAndDown)

posted @ 2019-11-17 18:30  RandySun  阅读(1001)  评论(0编辑  收藏  举报