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.
DjangoBlog/blog/models.py

93 lines
3.7 KiB

from django.db import models
from django.contrib.auth.models import User
class Category(models.Model):
"""非遗分类"""
name = models.CharField(max_length=100, unique=True, verbose_name="分类名称")
description = models.TextField(blank=True, verbose_name="分类描述")
icon = models.CharField(max_length=50, default="🏮", verbose_name="分类图标")
order = models.IntegerField(default=0, verbose_name="显示顺序")
class Meta:
verbose_name = "非遗分类"
verbose_name_plural = "非遗分类"
ordering = ['order']
def __str__(self):
return self.name
class PrimaryTag(models.Model):
"""一级标签"""
name = models.CharField(max_length=100, unique=True, verbose_name="标签名称")
color = models.CharField(max_length=7, default="#8b4513", verbose_name="标签颜色")
class Meta:
verbose_name = "一级标签"
verbose_name_plural = "一级标签"
def __str__(self):
return self.name
class SecondaryTag(models.Model):
"""二级标签"""
TAG_TYPE_CHOICES = [
('geo', '地理空间'),
('theme', '主题维度'),
('project', '非遗项目'),
('person', '人物传承'),
('time', '时间节庆'),
]
name = models.CharField(max_length=100, verbose_name="标签名称")
tag_type = models.CharField(max_length=20, choices=TAG_TYPE_CHOICES, verbose_name="标签类型")
parent_tag = models.ForeignKey(PrimaryTag, on_delete=models.CASCADE, null=True, blank=True, verbose_name="父级标签")
class Meta:
verbose_name = "二级标签"
verbose_name_plural = "二级标签"
def __str__(self):
return f"{self.name} ({self.get_tag_type_display()})"
class Post(models.Model):
"""非遗文章"""
STATUS_CHOICES = [
('draft', '草稿'),
('published', '已发布'),
]
title = models.CharField(max_length=200, verbose_name="文章标题")
content = models.TextField(verbose_name="文章内容")
excerpt = models.TextField(max_length=300, blank=True, verbose_name="文章摘要")
author = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name="作者")
category = models.ForeignKey(Category, on_delete=models.CASCADE, verbose_name="分类")
primary_tags = models.ManyToManyField(PrimaryTag, blank=True, verbose_name="一级标签")
secondary_tags = models.ManyToManyField(SecondaryTag, blank=True, verbose_name="二级标签")
featured_image = models.ImageField(upload_to='posts/%Y/%m/', blank=True, null=True, verbose_name="特色图片")
views = models.PositiveIntegerField(default=0, verbose_name="阅读量")
status = models.CharField(max_length=10, choices=STATUS_CHOICES, default='published', verbose_name="状态")
created_time = models.DateTimeField(auto_now_add=True, verbose_name="创建时间")
updated_time = models.DateTimeField(auto_now=True, verbose_name="更新时间")
class Meta:
verbose_name = "非遗文章"
verbose_name_plural = "非遗文章"
ordering = ['-created_time']
def __str__(self):
return self.title
class Comment(models.Model):
"""文章评论"""
post = models.ForeignKey(Post, on_delete=models.CASCADE, verbose_name="所属文章")
author = models.CharField(max_length=100, verbose_name="评论者")
content = models.TextField(verbose_name="评论内容")
created_time = models.DateTimeField(auto_now_add=True, verbose_name="评论时间")
class Meta:
verbose_name = "评论"
verbose_name_plural = "评论"
ordering = ['-created_time']
def __str__(self):
return f'{self.author} 评论了《{self.post.title}'