sync from local backup
This commit is contained in:
@@ -0,0 +1,121 @@
|
||||
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}'
|
||||
Reference in New Issue
Block a user