#lsx 评论模型定义 from django.db import models from django.contrib.auth import get_user_model from django.urls import reverse from django.utils import timezone from django.utils.translation import gettext_lazy as _ #lsx 评论模型,用于存储用户对文章的评论 class Comment(models.Model): #lsx 评论状态:待审核和已启用 STATUS = (('n', _('Pending')), ('p', _('Published'))) #lsx 评论正文 body = models.TextField(_('comment content'), max_length=2000) #lsx 评论者邮箱(未登录用户) email = models.EmailField(_('email address'), max_length=100, blank=True, null=True) #lsx 评论者用户名(未登录用户) name = models.CharField(_('name'), max_length=50, blank=True, null=True) #lsx 评论者网址(未登录用户) url = models.URLField(_('url'), blank=True, null=True, max_length=100) #lsx 评论状态 status = models.CharField( _('status'), max_length=1, choices=STATUS, default='n') #lsx 评论时间 create_time = models.DateTimeField(_('create time'), default=timezone.now) #lsx 是否启用 is_enable = models.BooleanField(_('is enable'), default=False) #lsx 评论所属文章 article = models.ForeignKey( 'blog.Article', verbose_name=_('article'), on_delete=models.CASCADE) #lsx 评论作者(外键关联用户) author = models.ForeignKey( get_user_model(), verbose_name=_('author'), blank=True, null=True, on_delete=models.CASCADE) #lsx 父评论(用于回复功能) parent_comment = models.ForeignKey( 'self', verbose_name=_('parent comment'), blank=True, null=True, on_delete=models.CASCADE) #lsx 返回评论内容的前20个字符作为对象的字符串表示 def __str__(self): return self.body[:20] class Meta: ordering = ['create_time'] #lsx 按创建时间排序 verbose_name = _('comment') #lsx 在管理后台显示的名称 verbose_name_plural = _('comments') #lsx 复数形式 #lsx 获取评论的绝对URL def get_absolute_url(self): return reverse('blog:article_detail', kwargs={'article_id': self.article_id}) #lsx 获取评论在管理后台的编辑URL def get_admin_url(self): return reverse('admin:comments_comment_change', kwargs={'object_id': self.id}) #lsx 保存评论时的逻辑处理 def save(self, *args, **kwargs): super().save(*args, **kwargs) #lsx 如果是回复评论,自动设置为已启用 if self.parent_comment: self.is_enable = True super().save(*args, **kwargs) #lsx 回复评论模型(备选方案,目前使用自关联方式实现回复) class Reply(models.Model): #lsx 回复内容 content = models.TextField(_('reply content'), max_length=1000) #lsx 回复时间 create_time = models.DateTimeField(_('create time'), default=timezone.now) #lsx 回复所属评论 comment = models.ForeignKey(Comment, verbose_name=_('comment'), on_delete=models.CASCADE) #lsx 回复作者 author = models.ForeignKey( get_user_model(), verbose_name=_('author'), on_delete=models.CASCADE) #lsx 返回回复内容的前20个字符作为对象的字符串表示 def __str__(self): return self.content[:20] class Meta: ordering = ['create_time'] #lsx 按创建时间排序 verbose_name = _('reply') #lsx 在管理后台显示的名称 verbose_name_plural = _('replies') #lsx 复数形式 #lsx 评论配置模型(可选,用于存储评论相关设置) class CommentConfig(models.Model): #lsx 是否开启评论功能 is_open = models.BooleanField(_('is open'), default=True) #lsx 是否需要审核 need_review = models.BooleanField(_('need review'), default=True) #lsx 配置更新时间 update_time = models.DateTimeField(_('update time'), default=timezone.now) #lsx 返回配置标识 def __str__(self): return 'Comment Configuration' class Meta: verbose_name = _('comment configuration') #lsx 在管理后台显示的名称 verbose_name_plural = verbose_name #lsx 复数形式 #lsx 保存配置时更新时间 def save(self, *args, **kwargs): self.update_time = timezone.now() super().save(*args, **kwargs) #lsx 评论统计模型(可选,用于统计评论数据) class CommentStats(models.Model): #lsx 文章ID article_id = models.IntegerField(_('article id'), unique=True) #lsx 评论总数 comment_count = models.IntegerField(_('comment count'), default=0) #lsx 已启用评论数 enabled_count = models.IntegerField(_('enabled count'), default=0) #lsx 最后评论时间 last_comment_time = models.DateTimeField(_('last comment time'), null=True, blank=True) #lsx 返回文章ID和评论数 def __str__(self): return f'Article {self.article_id}: {self.comment_count} comments' class Meta: ordering = ['-comment_count'] #lsx 按评论数倒序排序 verbose_name = _('comment statistics') #lsx 在管理后台显示的名称 verbose_name_plural = verbose_name #lsx 复数形式 #lsx 评论通知模型(可选,用于通知功能) class CommentNotification(models.Model): #lsx 通知类型:评论、回复 TYPE = (('c', _('Comment')), ('r', _('Reply'))) #lsx 通知状态:未读、已读 STATUS = (('u', _('Unread')), ('r', _('Read'))) #lsx 通知类型 notification_type = models.CharField( _('notification type'), max_length=1, choices=TYPE, default='c') #lsx 通知状态 status = models.CharField( _('status'), max_length=1, choices=STATUS, default='u') #lsx 通知时间 create_time = models.DateTimeField(_('create time'), default=timezone.now) #lsx 相关评论 comment = models.ForeignKey(Comment, verbose_name=_('comment'), on_delete=models.CASCADE) #lsx 接收通知的用户 recipient = models.ForeignKey( get_user_model(), verbose_name=_('recipient'), on_delete=models.CASCADE) #lsx 返回通知信息 def __str__(self): return f'Notification for {self.recipient}: {self.comment.body[:20]}' class Meta: ordering = ['-create_time'] #lsx 按创建时间倒序排序 verbose_name = _('comment notification') #lsx 在管理后台显示的名称 verbose_name_plural = verbose_name #lsx 复数形式 #lsx 评论点赞模型(可选,用于点赞功能) class CommentLike(models.Model): #lsx 点赞时间 create_time = models.DateTimeField(_('create time'), default=timezone.now) #lsx 点赞的评论 comment = models.ForeignKey(Comment, verbose_name=_('comment'), on_delete=models.CASCADE) #lsx 点赞的用户 user = models.ForeignKey( get_user_model(), verbose_name=_('user'), on_delete=models.CASCADE) #lsx 返回点赞信息 def __str__(self): return f'{self.user} likes comment {self.comment.id}' class Meta: unique_together = ('comment', 'user') #lsx 一个用户只能给一个评论点赞一次 verbose_name = _('comment like') #lsx 在管理后台显示的名称 verbose_name_plural = verbose_name #lsx 复数形式