Files
2026-08-05 23:59:15 +08:00

122 lines
4.9 KiB
Python

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}'