【零】创建公共表
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】指定默认用户模型表
# 默认用户模型指定
AUTH_USER_MODEL = 'book.UserInfo'
【3】注册admin后台
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】创建模型表
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后台
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】创建模型表
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后台
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