|
|
|
|
@ -1,3 +1,4 @@
|
|
|
|
|
#zyl:
|
|
|
|
|
from django.conf import settings
|
|
|
|
|
from django.db import models
|
|
|
|
|
from django.utils.timezone import now
|
|
|
|
|
@ -5,35 +6,88 @@ from django.utils.translation import gettext_lazy as _
|
|
|
|
|
|
|
|
|
|
from blog.models import Article
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Create your models here.
|
|
|
|
|
|
|
|
|
|
class Comment(models.Model):
|
|
|
|
|
"""
|
|
|
|
|
评论模型:用于存储用户对博客文章的评论
|
|
|
|
|
支持嵌套评论(回复功能)和软删除(is_enable 控制显示)
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
# 评论正文内容,最大长度300字符
|
|
|
|
|
# verbose_name='正文' 在 Django Admin 中显示为"正文"
|
|
|
|
|
body = models.TextField('正文', max_length=300)
|
|
|
|
|
|
|
|
|
|
# 评论创建时间,默认值为当前时间
|
|
|
|
|
# 使用 _('creation time') 支持国际化翻译
|
|
|
|
|
creation_time = models.DateTimeField(_('creation time'), default=now)
|
|
|
|
|
|
|
|
|
|
# 评论最后修改时间,默认值为当前时间
|
|
|
|
|
# 每次调用 save() 方法时需要手动更新此字段
|
|
|
|
|
last_modify_time = models.DateTimeField(_('last modify time'), default=now)
|
|
|
|
|
|
|
|
|
|
# 外键关联:评论作者
|
|
|
|
|
# settings.AUTH_USER_MODEL 使用项目配置的用户模型(默认为 auth.User)
|
|
|
|
|
# on_delete=models.CASCADE:当用户被删除时,级联删除其所有评论
|
|
|
|
|
# verbose_name=_('author'):在后台显示为"author"(可翻译)
|
|
|
|
|
author = models.ForeignKey(
|
|
|
|
|
settings.AUTH_USER_MODEL,
|
|
|
|
|
verbose_name=_('author'),
|
|
|
|
|
on_delete=models.CASCADE)
|
|
|
|
|
|
|
|
|
|
# 外键关联:评论所属的文章
|
|
|
|
|
# on_delete=models.CASCADE:当文章被删除时,级联删除该文章的所有评论
|
|
|
|
|
article = models.ForeignKey(
|
|
|
|
|
Article,
|
|
|
|
|
verbose_name=_('article'),
|
|
|
|
|
on_delete=models.CASCADE)
|
|
|
|
|
|
|
|
|
|
# 自关联外键:上级评论(用于实现评论嵌套/回复功能)
|
|
|
|
|
# 'self' 表示关联到 Comment 模型自身
|
|
|
|
|
# blank=True, null=True:允许为空(顶级评论没有父评论)
|
|
|
|
|
# on_delete=models.CASCADE:当父评论被删除时,级联删除所有子评论
|
|
|
|
|
# 理论上可以支持无限层级的评论嵌套
|
|
|
|
|
parent_comment = models.ForeignKey(
|
|
|
|
|
'self',
|
|
|
|
|
verbose_name=_('parent comment'),
|
|
|
|
|
blank=True,
|
|
|
|
|
null=True,
|
|
|
|
|
on_delete=models.CASCADE)
|
|
|
|
|
|
|
|
|
|
# 是否启用/显示该评论的布尔字段
|
|
|
|
|
# default=False:新评论默认不显示,需要审核后才能显示
|
|
|
|
|
# blank=False, null=False:不允许为空(在表单和数据库中都必填)
|
|
|
|
|
# 实现"软删除"功能,避免物理删除评论数据
|
|
|
|
|
is_enable = models.BooleanField(_('enable'),
|
|
|
|
|
default=False, blank=False, null=False)
|
|
|
|
|
|
|
|
|
|
class Meta:
|
|
|
|
|
"""
|
|
|
|
|
模型元数据配置:定义模型在 Django Admin 中的行为和显示
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
# 默认排序规则:按 ID 降序排列,最新评论在前
|
|
|
|
|
ordering = ['-id']
|
|
|
|
|
|
|
|
|
|
# 模型单数名称:在 Django Admin 中显示为"comment"(可翻译)
|
|
|
|
|
verbose_name = _('comment')
|
|
|
|
|
|
|
|
|
|
# 模型复数名称:复数形式与单数相同
|
|
|
|
|
verbose_name_plural = verbose_name
|
|
|
|
|
|
|
|
|
|
# 指定获取"最新"记录时使用的字段
|
|
|
|
|
# 可通过 Comment.objects.latest() 获取最新评论
|
|
|
|
|
get_latest_by = 'id'
|
|
|
|
|
|
|
|
|
|
def __str__(self):
|
|
|
|
|
"""
|
|
|
|
|
返回评论对象的字符串表示
|
|
|
|
|
在 Django Admin 和调试时显示评论正文(最多300字符)
|
|
|
|
|
"""
|
|
|
|
|
return self.body
|
|
|
|
|
|
|
|
|
|
# 使用建议:
|
|
|
|
|
# 1. 在视图中创建评论后,应调用 save() 方法保存
|
|
|
|
|
# 2. 修改评论内容时,需要手动更新 last_modify_time 字段:
|
|
|
|
|
# comment.last_modify_time = now()
|
|
|
|
|
# 3. 前端展示评论时,应过滤 is_enable=True 的评论
|