from django.db import models from django.conf import settings STATUS_CHOICES = [ ('published', '已发布'), ('draft', '草稿'), ('reviewing', '审核中'), ('rejected', '已拒绝'), ] EDITOR_MODE_CHOICES = [ ('rich', '富文本'), ('markdown', 'Markdown'), ] CATEGORY_CHOICES = [ ('tech', '技术教程'), ('design', '设计前沿'), ('productivity', '效率方法'), ('industry', '行业洞察'), ('React', 'React'), ('Vue', 'Vue'), ('TypeScript', 'TypeScript'), ('Django', 'Django'), ('Python', 'Python'), ('CSS', 'CSS'), ('Go', 'Go'), ('DevOps', 'DevOps'), ('other', '其他'), ] class Article(models.Model): title = models.CharField(max_length=200, verbose_name='标题') excerpt = models.TextField(blank=True, default='', verbose_name='摘要') content = models.TextField(verbose_name='内容') category = models.CharField(max_length=50, choices=CATEGORY_CHOICES, default='tech', verbose_name='分类') tags = models.JSONField(default=list, blank=True, verbose_name='标签') cover_image = models.ImageField(upload_to='articles/covers/%Y/%m/', blank=True, null=True, verbose_name='封面图') author = models.ForeignKey( settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='articles', verbose_name='作者' ) status = models.CharField(max_length=20, choices=STATUS_CHOICES, default='published', verbose_name='状态') editor_mode = models.CharField(max_length=10, choices=EDITOR_MODE_CHOICES, default='rich', verbose_name='编辑模式') views = models.PositiveIntegerField(default=0, verbose_name='浏览量') likes = models.PositiveIntegerField(default=0, verbose_name='点赞数') is_top = models.BooleanField(default=False, verbose_name='是否置顶') is_featured = models.BooleanField(default=False, verbose_name='是否精选') created_at = models.DateTimeField(auto_now_add=True, verbose_name='创建时间') updated_at = models.DateTimeField(auto_now=True, verbose_name='更新时间') class Meta: verbose_name = '文章' verbose_name_plural = '文章' ordering = ['-is_top', '-created_at'] def __str__(self): return self.title class ArticleComment(models.Model): article = models.ForeignKey(Article, on_delete=models.CASCADE, related_name='comments', verbose_name='文章') user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='article_comments', verbose_name='用户') content = models.TextField(verbose_name='评论内容') parent = models.ForeignKey('self', on_delete=models.CASCADE, null=True, blank=True, related_name='replies', verbose_name='父评论') likes = models.PositiveIntegerField(default=0, verbose_name='点赞数') created_at = models.DateTimeField(auto_now_add=True, verbose_name='创建时间') class Meta: verbose_name = '文章评论' verbose_name_plural = '文章评论' ordering = ['-created_at'] def __str__(self): return f'{self.user} - {self.content[:30]}' class ArticleLike(models.Model): user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='article_likes', verbose_name='用户') article = models.ForeignKey(Article, on_delete=models.CASCADE, related_name='article_likes', verbose_name='文章') created_at = models.DateTimeField(auto_now_add=True, verbose_name='创建时间') class Meta: verbose_name = '文章点赞' verbose_name_plural = '文章点赞' unique_together = ['user', 'article'] def __str__(self): return f'{self.user} likes {self.article}' class ArticleFavorite(models.Model): user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='article_favorites', verbose_name='用户') article = models.ForeignKey(Article, on_delete=models.CASCADE, related_name='article_favorites', verbose_name='文章') created_at = models.DateTimeField(auto_now_add=True, verbose_name='创建时间') class Meta: verbose_name = '文章收藏' verbose_name_plural = '文章收藏' unique_together = ['user', 'article'] def __str__(self): return f'{self.user} favorites {self.article}' class ArticleCommentLike(models.Model): user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='comment_likes', verbose_name='用户') comment = models.ForeignKey(ArticleComment, on_delete=models.CASCADE, related_name='comment_likes', verbose_name='评论') created_at = models.DateTimeField(auto_now_add=True, verbose_name='创建时间') class Meta: verbose_name = '评论点赞' verbose_name_plural = '评论点赞' unique_together = ['user', 'comment'] def __str__(self): return f'{self.user} likes comment {self.comment_id}'