表的创建

【零】创建公共表

  • lib/CommonModel.py
from django.db import models


class CommonModel(models.Model):
    create_time = models.DateTimeField(auto_now_add=True, verbose_name="创建时间")
    update_time = models.DateTimeField(auto_now=True, verbose_name="更新时间")

    class Meta:
        #  抽象模型类不能创建表
        abstract = True

【一】创建用户表

【1】创建模型表

  • user/models.py
  • 内置用户类AbstractUser就是Django内置的一个关于用户操作的类,它极大地方便了我们对model模型中对User用户类的设计
from django.db import models

from lib.CommonModel import CommonModel

# Create your models here.
'''
先写普通字段
再写外键字段
'''

from django.contrib.auth.models import AbstractUser


# 用户表
class UserInfo(AbstractUser, CommonModel):
    #null=True: 这是可选参数,表示该字段在数据库中可以存储空值(NULL)。
    #blank=True: 这是可选参数,表示在创建对象时可以不填写该字段。
    phone = models.BigIntegerField(verbose_name="手机号", help_text="手机号", null=True, blank=True)
   
    # 依赖于 Pillow 模块 : python -m pip install Pillow
    avatar = models.FileField(verbose_name="用户头像", help_text="用户头像",
                              upload_to='static/avatar/', default='static/avatar/default.png')
    # 给avatar字段传文件对象,该文件会自动存储到 avatar 文件夹下,然后avatar字段只保存文件路径  例如 avatar/default.png(不上传文件的默认头像文件)
    #默认值是False,也就是说可以不填
    #默认用户标记: 可以使用这个字段来标记哪些用户是默认用户,以便在系统中进行特殊处理或提供额外的权限。
    is_deleted = models.BooleanField(verbose_name="逻辑删除", help_text="逻辑删除", default=False)

    # 用户关联个人站点
    # 一对一关系:一个用户只能有一个个人站点,一个个人站点只能对应一个用户
    blog = models.OneToOneField(verbose_name="关联博客", to="blog.Blog", on_delete=models.CASCADE, null=True)

    # 配置数据库元信息
    class Meta:
        # 指定数据库在后台显示的名字
        verbose_name = "用户表"
        verbose_name_plural = verbose_name
        # 指定当前模型表在数据库中的表名
        db_table = "userinfo"

    # 默认以当前用户名返回
    def __str__(self):
        return self.username

【2】指定默认用户模型表

  • 配置文件修改指定 User
# 默认用户模型指定
AUTH_USER_MODEL = 'book.UserInfo'

【3】注册admin后台

  • user/admin.py
from django.contrib import admin
from user.models import UserInfo


# Register your models here.

# 创建一个类并用它来定制UserInfo
@admin.register(UserInfo)
# 这个类必须继承 admin.ModelAdmin
class UserInfoAdmin(admin.ModelAdmin):
    # 后台展示的信息,默认是全部都展示,但是可以定制展示的字段
    list_display = ['username', 'last_name', 'email', 'phone', 'avatar', 'create_time', 'is_deleted', 'blog']

【二】创建站点表

【1】创建模型表

  • blog/models.py
from django.db import models

from lib.CommonModel import CommonModel


# Create your models here.
# 个人站点表
class Blog(CommonModel):
    site_name = models.CharField(verbose_name="站点名称", help_text="站点名称", max_length=32)
    site_title = models.CharField(verbose_name="站点标题", help_text="站点标题", max_length=32)
    site_theme = models.CharField(verbose_name="站点样式", help_text="站点样式", max_length=64)  # css/js的文件路径

    # 配置数据库元信息
    class Meta:
        # 指定数据库在后台显示的名字
        verbose_name = "个人站点表"
        verbose_name_plural = verbose_name
        #  指定数据库在后台显示的表名
        db_table = "blog"

    # 默认以当前站点名称返回
    def __str__(self):
        return self.site_name


# 广告信息表
class Adv(models.Model):
    title = models.CharField(verbose_name="广告标题", help_text="广告标题", max_length=64)
    content = models.TextField(verbose_name="广告详细内容", help_text="广告详细内容")
    create_time = models.DateTimeField(verbose_name="创建时间", help_text="创建时间", auto_now=True)
    update_time = models.DateTimeField(verbose_name="更新时间", help_text="更新时间", auto_now_add=True)
    mobile = models.CharField(verbose_name="手机号", help_text="手机号", max_length=11,
                              default="", blank=True)
    img = models.ImageField(verbose_name="广告图片", help_text="广告图片",
                            upload_to="static/advImg/", default="")

    #  配置数据库元信息
    class Meta:
        # 数据库名字
        db_table = "adv"
        #  指定数据库在后台显示的名字
        verbose_name = '广告信息表'
        verbose_name_plural = verbose_name

【2】注册admin后台

  • blog/admin.py
from django.contrib import admin

# Register your models here.
from blog.models import Blog, Adv


@admin.register(Blog)
class BlogAdmin(admin.ModelAdmin):
    list_display = ['site_name', 'site_title', 'create_time', 'update_time', 'site_theme']


@admin.register(Adv)
class AdvAdmin(admin.ModelAdmin):
    list_display = ['title', 'content', 'create_time', 'update_time', 'mobile', 'img']

【三】创建文章相关表

【1】创建模型表

  • article/models.py
from django.db import models

from lib.CommonModel import CommonModel


# Create your models here.

# 文章表
class Article(CommonModel):
    title = models.CharField(verbose_name="文章标题", max_length=64)
    desc = models.CharField(verbose_name="文章简介", max_length=255)
    content = models.TextField(verbose_name="文章内容")
    # create_time
    # update_time

    # 数据库字段设计优化
    up_num = models.BigIntegerField(verbose_name="点赞数", default=0)
    down_num = models.BigIntegerField(verbose_name="点踩数", default=0)
    comment_num = models.BigIntegerField(verbose_name="评论数", default=0)

    # 文章关联个人站点
    # 一对多关系:一篇文章只能对应一个个人站点,但是一个个人站点可以有多篇文章
    blog = models.ForeignKey(verbose_name="关联博客", to="blog.Blog", on_delete=models.CASCADE, null=True)
    # 文章关联文章分类
    # 多对一关系:一篇文章可以对应一个分类,但是一个分类下可以有多篇文章
    category = models.ForeignKey(verbose_name="关联分类", to="CategoryClass", on_delete=models.CASCADE, null=True)
    # 文章关联文章标签
    # 多对多关系:一篇文章可以对应多个标签,一个标签下可以有多篇文章
    tags = models.ManyToManyField(verbose_name="关联文章和标签", to="CategoryTag",
                                  through='ArticleToTag', through_fields=("article", "tag"))

    # 定义数据库元信息
    class Meta:
        #  数据库表名
        db_table = "article"
        #  admin后台显示的表名称
        verbose_name = "文章表"
        verbose_name_plural = verbose_name

    # 默认以当前文章名称返回
    def __str__(self):
        return self.title


# 文章分类表
class CategoryClass(models.Model):
    name = models.CharField(verbose_name="文章分类", max_length=32)

    #  文章分类关联个人站点
    #  一对多关系:一个文章分类只能对应一个个人站点,但是一个个人站点可以有多个文章分类
    blog = models.ForeignKey(verbose_name="关联博客", to="blog.Blog", on_delete=models.CASCADE, null=True)

    # 配置数据库元信息
    class Meta:
        #  数据库表名
        db_table = "category_class"
        #  后台管理显示的名称
        verbose_name = "文章分类表"
        verbose_name_plural = verbose_name

    # 默认以当前文章名返回
    def __str__(self):
        return self.name


# 文章标签表
class CategoryTag(models.Model):
    name = models.CharField(verbose_name="文章标签", max_length=32)
    blog = models.ForeignKey(verbose_name="文章标签关联个人站点mi", to="blog.Blog",
                             null=True, blank=True, on_delete=models.CASCADE)

    # 配置数据库元信息
    class Meta:
        #   数据库表名
        db_table = "category_tag"
        #   后台管理显示的名称
        verbose_name = "文章标签表"
        verbose_name_plural = verbose_name

    # 默认以当前文章标签名返回
    def __str__(self):
        return self.name


# 创建关联表,用于存储文章和标签的关联关系(多对多关系)
class ArticleToTag(models.Model):
    article = models.ForeignKey(verbose_name="关联文章", to="Article", on_delete=models.CASCADE, null=True)
    tag = models.ForeignKey(verbose_name="关联标签", to="CategoryTag", on_delete=models.CASCADE, null=True)

    #  定义数据库元信息
    class Meta:
        # 数据库表名
        db_table = "article_to_tag"
        # admin后台显示的表名称
        verbose_name = "文章关联标签"
        verbose_name_plural = verbose_name


# 点赞点踩表
class UpAndDown(CommonModel):
    # 关联用户对象
    # 多对一关系:一篇文章可以对应多个用户,一个用户可以对多篇文章进行点赞点踩
    user = models.ForeignKey(verbose_name="关联用户", to='user.UserInfo', on_delete=models.CASCADE)
    # 关联文章对象
    article = models.ForeignKey(verbose_name="关联文章", to='Article', on_delete=models.CASCADE)
    # 点赞点踩状态
    up_or_down = models.BooleanField(verbose_name="是否点赞点踩")

    # create_time
    # update_time

    #  定义数据库元信息
    class Meta:
        #  数据库表名
        db_table = "up_and_down"
        #  admin后台显示的表名称
        verbose_name = "点赞点踩表"
        verbose_name_plural = verbose_name


# 评论表
class Comment(CommonModel):
    # 关联用户对象
    # 多对一关系:一篇文章可以对应多个用户,一个用户可以对多篇文章进行评论
    user = models.ForeignKey(verbose_name="关联用户", to='user.UserInfo', on_delete=models.CASCADE)
    # 关联文章对象
    # 多对一关系:一篇文章可以对应多个评论,一个评论只能对应一篇文章
    article = models.ForeignKey(verbose_name="关联文章", to='Article', on_delete=models.CASCADE)
    # 评论内容
    content = models.CharField(verbose_name="评论内容", max_length=255)
    # 评论的父评论 , 有些评论就是根评论
    parent = models.ForeignKey(verbose_name="自关联主评论", to="self", on_delete=models.CASCADE, null=True)
    is_deleted = models.BooleanField(verbose_name="是否删除评论,假删除", default=False)

    # create_time
    # update_time

    #   定义数据库元信息
    class Meta:
        # 数据库表名
        db_table = "comment"
        # admin后台显示的表名称
        verbose_name = "用户评论表"
        verbose_name_plural = verbose_name

【2】注册admin后台

  • article/admin.py
from django.contrib import admin

# Register your models here.
from article.models import CategoryClass, CategoryTag, Comment, UpAndDown, Article, ArticleToTag


@admin.register(Article)
class ArticleAdmin(admin.ModelAdmin):
    list_display = ['title', 'desc', 'up_num', 'down_num', 'comment_num', 'content',
                    'create_time', 'update_time', 'blog', 'category']


@admin.register(CategoryClass)
class CategoryClassAdmin(admin.ModelAdmin):
    list_display = ['name', 'blog']


@admin.register(CategoryTag)
class CategoryTagAdmin(admin.ModelAdmin):
    list_display = ['name', 'blog']


@admin.register(ArticleToTag)
class CategoryTagAdmin(admin.ModelAdmin):
    list_display = ['article', 'tag']


@admin.register(UpAndDown)
class UpAndDownAdmin(admin.ModelAdmin):
    list_display = ['user', 'article', 'up_or_down', 'create_time', 'update_time']


@admin.register(Comment)
class CommentAdmin(admin.ModelAdmin):
    list_display = ['user', 'article', 'content', 'is_deleted', 'parent', 'create_time', 'update_time']

【四】迁移数据库

【1】生成迁移文件

python manage.py makemigrations

【2】迁移记录生效

python manage.py migrate
posted @ 2024-03-27 09:03  -半城烟雨  阅读(8)  评论(0编辑  收藏  举报