122 lines
4.9 KiB
Python
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}'
|