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.
django/src/DjangoBlog/comments/models.py

181 lines
7.2 KiB

#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 复数形式