from django.conf import settings from django.db import models from django.utils.timezone import now from django.utils.translation import gettext_lazy as _ from blog.models import Article class Comment(models.Model): # 评论正文,限制最大输入长度 300,使用 TextField 以便输入多行内容 body = models.TextField('正文', max_length=300) # 评论创建时间,默认使用 timezone.now(可自动获取当前时区时间) creation_time = models.DateTimeField( _('creation time'), default=now ) # 评论最后修改时间,通常用于编辑评论功能,但如果不编辑也会保持不变 last_modify_time = models.DateTimeField( _('last modify time'), default=now ) # 评论作者,关联到用户模型,用户删除时,对应评论也一并删除 author = models.ForeignKey( settings.AUTH_USER_MODEL, verbose_name=_('author'), on_delete=models.CASCADE ) # 评论所属文章,关联到 Article 模型,文章被删除时,其下所有评论也被删除 article = models.ForeignKey( Article, verbose_name=_('article'), on_delete=models.CASCADE ) # 父评论,用于构建"评论回复"树结构 # 若为空 → 表示为一级评论;不为空 → 表示为某条评论的子评论 parent_comment = models.ForeignKey( 'self', # 自关联 verbose_name=_('parent comment'), blank=True, # 表单中允许为空 null=True, # 数据库允许为 null on_delete=models.CASCADE # 父评论删除时,子评论也被删除 ) # 是否启用评论(常用于需要审核评论是否展示) # 默认为 False → 新评论不会立刻显示,需要管理员审核启用 is_enable = models.BooleanField( _('enable'), default=False, blank=False, null=False ) class Meta: # 默认按 id 倒序排列 → 新评论显示在前 ordering = ['-id'] # Django Admin 后台显示的模型名称 verbose_name = _('comment') verbose_name_plural = verbose_name # latest() 方法依据 id 获取最新对象 get_latest_by = 'id' def __str__(self): # 后台及 shell 打印对象时显示评论内容 return self.body