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