From 2b43593f6b34a3bf8facefe3011287325c7feb79 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E6=82=A6?= Date: Sun, 12 Oct 2025 18:36:52 +0800 Subject: [PATCH] models.py --- src/django-master/comments/models.py | 75 ++++++++++++++++++---------- 1 file changed, 50 insertions(+), 25 deletions(-) diff --git a/src/django-master/comments/models.py b/src/django-master/comments/models.py index 7c3bbc8..f8fcd2e 100644 --- a/src/django-master/comments/models.py +++ b/src/django-master/comments/models.py @@ -1,39 +1,64 @@ -from django.conf import settings -from django.db import models -from django.utils.timezone import now -from django.utils.translation import gettext_lazy as _ +# 导入Django核心模块:配置、数据库模型、时间工具、国际化 +from django.conf import settings # 导入项目配置(用于获取自定义用户模型) +from django.db import models # Django数据库模型基类,所有模型需继承models.Model +from django.utils.timezone import now # 获取当前时区时间,用于时间字段默认值 +from django.utils.translation import gettext_lazy as _ # 国际化翻译,支持多语言显示 +# 导入关联模型:从blog应用导入Article模型(评论需关联到具体文章) from blog.models import Article # Create your models here. - class Comment(models.Model): + """ + 评论模型:存储用户对文章的评论数据,支持评论回复(父子评论) + 与User(用户)、Article(文章)为多对一关系,与自身为自关联(实现回复) + """ + # 1. 评论正文:长文本字段,限制最大300字符 body = models.TextField('正文', max_length=300) - creation_time = models.DateTimeField(_('creation time'), default=now) - last_modify_time = models.DateTimeField(_('last modify time'), default=now) + + # 2. 时间字段:创建时间和最后修改时间,默认值为当前时间 + creation_time = models.DateTimeField(_('creation time'), default=now) # 评论创建时间 + last_modify_time = models.DateTimeField(_('last modify time'), default=now) # 评论最后修改时间 + + # 3. 关联用户:多对一(多个评论属于一个用户) author = models.ForeignKey( - settings.AUTH_USER_MODEL, - verbose_name=_('author'), - on_delete=models.CASCADE) + settings.AUTH_USER_MODEL, # 关联项目配置的用户模型(而非固定User,更灵活) + verbose_name=_('author'), # 字段在Admin后台显示的名称(支持国际化) + on_delete=models.CASCADE # 级联删除:若用户被删除,其所有评论也会被删除 + ) + + # 4. 关联文章:多对一(多个评论属于一篇文章) article = models.ForeignKey( - Article, - verbose_name=_('article'), - on_delete=models.CASCADE) + Article, # 关联blog应用的Article模型 + verbose_name=_('article'), # Admin显示名 + on_delete=models.CASCADE # 级联删除:文章删除,关联评论也删除 + ) + + # 5. 父评论:自关联(实现评论回复,多个子评论对应一个父评论) parent_comment = models.ForeignKey( - 'self', - verbose_name=_('parent comment'), - blank=True, - null=True, - on_delete=models.CASCADE) - is_enable = models.BooleanField(_('enable'), - default=False, blank=False, null=False) + 'self', # 关联自身模型(表示父评论) + verbose_name=_('parent comment'), # Admin显示名 + blank=True, # 表单中允许为空(普通评论无父评论,回复评论才有) + null=True, # 数据库中允许为空(与blank=True配合使用) + on_delete=models.CASCADE # 级联删除:父评论删除,子评论也删除 + ) + + # 6. 启用状态:布尔值,控制评论是否在前端显示 + is_enable = models.BooleanField( + _('enable'), + default=False, # 默认禁用(需管理员审核后启用,防止垃圾评论) + blank=False, # 表单中不允许为空 + null=False # 数据库中不允许为空 + ) + # 模型元数据:控制模型的整体行为(排序、显示名等) class Meta: - ordering = ['-id'] - verbose_name = _('comment') - verbose_name_plural = verbose_name - get_latest_by = 'id' + ordering = ['-id'] # 数据查询时按ID倒序排列(最新评论在前) + verbose_name = _('comment') # 模型单数显示名(Admin中“评论”) + verbose_name_plural = verbose_name # 模型复数显示名(与单数一致,避免“评论s”) + get_latest_by = 'id' # 使用Model.objects.latest()时,按id字段取最新数据 + # 模型实例的字符串表示:打印评论对象时显示正文(便于调试和Admin显示) def __str__(self): - return self.body + return self.body \ No newline at end of file