diff --git a/src/DjangoBlog/comments/models.py b/src/DjangoBlog/comments/models.py index 7c3bbc8..73d440f 100644 --- a/src/DjangoBlog/comments/models.py +++ b/src/DjangoBlog/comments/models.py @@ -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 的评论 \ No newline at end of file