|
|
|
|
@ -1,38 +1,91 @@
|
|
|
|
|
# Generated by Django 4.1.7 on 2023-03-02 07:14
|
|
|
|
|
# Django自动生成的数据库迁移文件:用于创建Comment(评论)模型对应的数据库表
|
|
|
|
|
# 迁移文件作用:记录模型结构变化,通过`python manage.py migrate`同步到数据库
|
|
|
|
|
|
|
|
|
|
# 导入Django迁移所需模块:配置、迁移基类、字段类型、关联逻辑、时间工具
|
|
|
|
|
from django.conf import settings
|
|
|
|
|
from django.db import migrations, models
|
|
|
|
|
import django.db.models.deletion
|
|
|
|
|
import django.utils.timezone
|
|
|
|
|
import django.db.models.deletion # 用于定义外键删除策略(如CASCADE)
|
|
|
|
|
import django.utils.timezone # 用于时间字段的默认值
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class Migration(migrations.Migration):
|
|
|
|
|
"""
|
|
|
|
|
Comment模型的初始迁移类:负责在数据库中创建`comments_comment`表
|
|
|
|
|
所有迁移类都必须继承migrations.Migration
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
# 标识该迁移是模型的「初始迁移」(第一次为Comment模型创建表)
|
|
|
|
|
initial = True
|
|
|
|
|
|
|
|
|
|
# 迁移依赖:执行当前迁移前,必须先执行依赖的迁移
|
|
|
|
|
dependencies = [
|
|
|
|
|
('blog', '0001_initial'),
|
|
|
|
|
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
|
|
|
|
('blog', '0001_initial'), # 依赖blog应用的0001_initial迁移(因Comment关联blog的Article模型)
|
|
|
|
|
migrations.swappable_dependency(settings.AUTH_USER_MODEL), # 依赖用户模型的可交换迁移(适配自定义用户模型)
|
|
|
|
|
]
|
|
|
|
|
|
|
|
|
|
# 迁移操作:当前迁移要执行的具体数据库操作(此处为「创建Comment表」)
|
|
|
|
|
operations = [
|
|
|
|
|
# 1. 创建Comment模型对应的数据库表
|
|
|
|
|
migrations.CreateModel(
|
|
|
|
|
name='Comment',
|
|
|
|
|
name='Comment', # 模型名称(与代码中定义的Comment类一致)
|
|
|
|
|
# 2. 定义表的字段(对应模型中的字段,映射到数据库表的列)
|
|
|
|
|
fields=[
|
|
|
|
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
|
|
|
|
('body', models.TextField(max_length=300, verbose_name='正文')),
|
|
|
|
|
('created_time', models.DateTimeField(default=django.utils.timezone.now, verbose_name='创建时间')),
|
|
|
|
|
('last_mod_time', models.DateTimeField(default=django.utils.timezone.now, verbose_name='修改时间')),
|
|
|
|
|
('is_enable', models.BooleanField(default=True, verbose_name='是否显示')),
|
|
|
|
|
('article', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='blog.article', verbose_name='文章')),
|
|
|
|
|
('author', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='作者')),
|
|
|
|
|
('parent_comment', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='comments.comment', verbose_name='上级评论')),
|
|
|
|
|
# 主键字段:BigAutoField(自增bigint类型),Django默认主键,无需在模型中手动定义
|
|
|
|
|
('id', models.BigAutoField(
|
|
|
|
|
auto_created=True, # 自动创建
|
|
|
|
|
primary_key=True, # 设为主键
|
|
|
|
|
serialize=False, # 不序列化(主键无需序列化)
|
|
|
|
|
verbose_name='ID' # 字段显示名(Admin后台中显示)
|
|
|
|
|
)),
|
|
|
|
|
# 评论正文字段:TextField(长文本类型),对应模型中的body字段
|
|
|
|
|
('body', models.TextField(
|
|
|
|
|
max_length=300, # 最大长度300字符
|
|
|
|
|
verbose_name='正文' # 显示名
|
|
|
|
|
)),
|
|
|
|
|
# 创建时间字段:DateTimeField(日期时间类型),对应模型中的created_time
|
|
|
|
|
('created_time', models.DateTimeField(
|
|
|
|
|
default=django.utils.timezone.now, # 默认值为当前时区时间
|
|
|
|
|
verbose_name='创建时间'
|
|
|
|
|
)),
|
|
|
|
|
# 修改时间字段:DateTimeField,对应模型中的last_mod_time
|
|
|
|
|
('last_mod_time', models.DateTimeField(
|
|
|
|
|
default=django.utils.timezone.now,
|
|
|
|
|
verbose_name='修改时间'
|
|
|
|
|
)),
|
|
|
|
|
# 是否显示字段:BooleanField(布尔类型),对应模型中的is_enable
|
|
|
|
|
('is_enable', models.BooleanField(
|
|
|
|
|
default=True, # 默认值为True(创建后默认显示)
|
|
|
|
|
verbose_name='是否显示'
|
|
|
|
|
)),
|
|
|
|
|
# 外键:关联文章(blog应用的Article模型),对应模型中的article字段
|
|
|
|
|
('article', models.ForeignKey(
|
|
|
|
|
on_delete=django.db.models.deletion.CASCADE, # 级联删除:文章删,评论删
|
|
|
|
|
to='blog.article', # 关联目标:blog应用的Article模型
|
|
|
|
|
verbose_name='文章'
|
|
|
|
|
)),
|
|
|
|
|
# 外键:关联用户(项目配置的用户模型),对应模型中的author字段
|
|
|
|
|
('author', models.ForeignKey(
|
|
|
|
|
on_delete=django.db.models.deletion.CASCADE, # 级联删除:用户删,评论删
|
|
|
|
|
to=settings.AUTH_USER_MODEL, # 关联目标:自定义用户模型(灵活适配)
|
|
|
|
|
verbose_name='作者'
|
|
|
|
|
)),
|
|
|
|
|
# 外键:关联父评论(自关联,Comment模型自身),对应模型中的parent_comment字段
|
|
|
|
|
('parent_comment', models.ForeignKey(
|
|
|
|
|
blank=True, # 表单中允许为空(普通评论无父评论)
|
|
|
|
|
null=True, # 数据库中允许为空(与blank=True配合)
|
|
|
|
|
on_delete=django.db.models.deletion.CASCADE, # 级联删除:父评论删,子评论删
|
|
|
|
|
to='comments.comment', # 关联目标:comments应用的Comment模型(自关联)
|
|
|
|
|
verbose_name='上级评论'
|
|
|
|
|
)),
|
|
|
|
|
],
|
|
|
|
|
# 3. 模型的额外配置(映射到数据库表的属性和默认行为)
|
|
|
|
|
options={
|
|
|
|
|
'verbose_name': '评论',
|
|
|
|
|
'verbose_name_plural': '评论',
|
|
|
|
|
'ordering': ['-id'],
|
|
|
|
|
'get_latest_by': 'id',
|
|
|
|
|
'verbose_name': '评论', # 模型单数显示名(Admin中显示)
|
|
|
|
|
'verbose_name_plural': '评论', # 模型复数显示名(与单数一致,避免“评论s”)
|
|
|
|
|
'ordering': ['-id'], # 表数据默认排序:按id倒序(最新评论在前)
|
|
|
|
|
'get_latest_by': 'id', # 用Model.objects.latest()时,按id取最新数据
|
|
|
|
|
# 注:Django会自动根据模型名生成表名:app名_模型名 → comments_comment
|
|
|
|
|
},
|
|
|
|
|
),
|
|
|
|
|
]
|
|
|
|
|
]
|