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

115 lines
6.1 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

from django.db import models
from django.conf import settings # 新增导入
class Category(models.Model):
"""非遗分类"""
# HJH分类名称字段最大长度100字符必须唯一用于后台显示名称
name = models.CharField(max_length=100, unique=True, verbose_name="分类名称")
# HJH分类描述字段Text类型允许长文本blank=True表示可为空
description = models.TextField(blank=True, verbose_name="分类描述")
# HJH分类图标字段存储图标字符或表情默认使用🏮表情
icon = models.CharField(max_length=50, default="🏮", verbose_name="分类图标")
# HJH显示顺序字段整数类型用于控制分类在前端的显示顺序
order = models.IntegerField(default=0, verbose_name="显示顺序")
class Meta:
# HJH设置模型在Django管理后台的单数显示名称
verbose_name = "非遗分类"
# HJH设置模型在Django管理后台的复数显示名称
verbose_name_plural = "非遗分类"
# HJH默认按order字段升序排列数字小的排在前面
ordering = ['order']
def __str__(self):
# HJH定义对象的字符串表示形式在管理后台和shell中显示分类名称
return self.name
class PrimaryTag(models.Model):
"""一级标签"""
# HJH一级标签名称字段最大长度100字符必须唯一
name = models.CharField(max_length=100, unique=True, verbose_name="标签名称")
# HJH标签颜色字段存储十六进制颜色值默认值为棕色#8b4513
color = models.CharField(max_length=7, default="#8b4513", verbose_name="标签颜色")
class Meta:
# HJH设置模型在Django管理后台的单数显示名称
verbose_name = "一级标签"
# HJH设置模型在Django管理后台的复数显示名称
verbose_name_plural = "一级标签"
def __str__(self):
# HJH定义对象的字符串表示形式返回标签名称
return self.name
class SecondaryTag(models.Model):
"""二级标签"""
# HJH定义二级标签的类型选择项每个元组包含(数据库值, 显示名称)
TAG_TYPE_CHOICES = [
('geo', '地理空间'),
('theme', '主题维度'),
('project', '非遗项目'),
('person', '人物传承'),
('time', '时间节庆'),
]
# HJH二级标签名称字段最大长度100字符
name = models.CharField(max_length=100, verbose_name="标签名称")
# HJH标签类型字段使用预定义的选择项max_length=20足够存储所有选项
tag_type = models.CharField(max_length=20, choices=TAG_TYPE_CHOICES, verbose_name="标签类型")
# HJH外键关联到一级标签on_delete=CASCADE表示父标签删除时子标签也删除
parent_tag = models.ForeignKey(PrimaryTag, on_delete=models.CASCADE, null=True, blank=True, verbose_name="父级标签")
class Meta:
# HJH设置模型在Django管理后台的单数显示名称
verbose_name = "二级标签"
# HJH设置模型在Django管理后台的复数显示名称
verbose_name_plural = "二级标签"
def __str__(self):
# HJH定义对象的字符串表示形式返回标签名称和类型显示名称
return f"{self.name} ({self.get_tag_type_display()})"
class Post(models.Model):
"""非遗文章"""
# HJH定义文章状态的选择项用于status字段
STATUS_CHOICES = [
('draft', '草稿'),
('published', '已发布'),
]
# HJH文章标题字段最大长度200字符
title = models.CharField(max_length=200, verbose_name="文章标题")
# HJH文章内容字段Text类型支持长文本内容
content = models.TextField(verbose_name="文章内容")
# HJH文章摘要字段最大长度300字符blank=True表示可为空
excerpt = models.TextField(max_length=300, blank=True, verbose_name="文章摘要")
# HJH外键关联到用户模型使用Django设置中的AUTH_USER_MODEL确保兼容性
author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, verbose_name="作者")
# HJH外键关联到分类模型文章必须属于一个分类
category = models.ForeignKey(Category, on_delete=models.CASCADE, verbose_name="分类")
# HJH多对多关联到一级标签blank=True表示可以为空标签集合
primary_tags = models.ManyToManyField(PrimaryTag, blank=True, verbose_name="一级标签")
# HJH多对多关联到二级标签blank=True表示可以为空标签集合
secondary_tags = models.ManyToManyField(SecondaryTag, blank=True, verbose_name="二级标签")
# HJH特色图片字段图片上传到posts/年/月/目录,可为空
featured_image = models.ImageField(upload_to='posts/%Y/%m/', blank=True, null=True, verbose_name="特色图片")
# HJH阅读量字段PositiveIntegerField确保非负整数默认值为0
views = models.PositiveIntegerField(default=0, verbose_name="阅读量")
# HJH文章状态字段使用选择项默认状态为'published'已发布
status = models.CharField(max_length=10, choices=STATUS_CHOICES, default='published', verbose_name="状态")
# HJH创建时间字段auto_now_add=True在对象创建时自动设置当前时间
created_time = models.DateTimeField(auto_now_add=True, verbose_name="创建时间")
# HJH更新时间字段auto_now=True在对象保存时自动更新为当前时间
updated_time = models.DateTimeField(auto_now=True, verbose_name="更新时间")
class Meta:
# HJH设置模型在Django管理后台的单数显示名称
verbose_name = "非遗文章"
# HJH设置模型在Django管理后台的复数显示名称
verbose_name_plural = "非遗文章"
# HJH默认按创建时间降序排列最新的文章显示在最前面
ordering = ['-created_time']
def __str__(self):
# HJH定义对象的字符串表示形式返回文章标题
return self.title