You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
DjangoBlog/comments/models.py

81 lines
3.8 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 赵瑞萍:评论模型模块,定义评论数据结构及关联关系
# 功能:存储用户对文章的评论信息,支持嵌套回复,包含评论内容、时间、作者、关联文章等核心数据
# 特性:支持国际化显示、级联删除关联数据、默认排序规则及评论状态管理
# 赵瑞萍导入Django核心模块提供配置、数据库操作、时间处理和国际化支持
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 django.utils.html import escape # 新增导入
# 赵瑞萍:导入关联模型,评论需与博客文章建立关联关系
from blog.models import Article # 博客文章模型,评论将关联到具体文章
class Comment(models.Model):
"""
赵瑞萍:评论模型类,映射数据库中存储评论的表结构
记录评论的内容、时间、作者、关联文章、父评论及显示状态等信息
支持评论嵌套回复和国际化管理
"""
# 赵瑞萍评论正文字段限制最大300字符避免内容过长
body = models.TextField('正文', max_length=300)
# 赵瑞萍 comments/models.py
# 赵瑞萍 将 creation_time 改为 created_time与迁移文件保持一致
created_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 = 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:
ordering = ['-id'] # 默认排序按ID降序最新评论优先显示
verbose_name = _('comment') # 模型单数显示名称(国际化)
verbose_name_plural = verbose_name # 模型复数显示名称(与单数相同)
get_latest_by = 'id' # 使用latest()方法时按ID字段判断最新记录
# 赵瑞萍:定义模型实例的字符串表示形式
# 在后台管理和调试时,直观显示评论内容(取正文作为标识)
def __str__(self):
return self.body
def save(self, *args, **kwargs):
# 保存前转义 HTML 特殊字符
self.body = escape(self.body)
super().save(*args, **kwargs)