95 lines
2.7 KiB
Python
95 lines
2.7 KiB
Python
"""
|
||
文章模型
|
||
"""
|
||
import uuid
|
||
from datetime import datetime
|
||
from tortoise import fields, models
|
||
|
||
|
||
class Post(models.Model):
|
||
"""文章模型"""
|
||
|
||
id = fields.UUIDField(pk=True, default=uuid.uuid4)
|
||
title = fields.CharField(max_length=200, description="文章标题")
|
||
slug = fields.CharField(max_length=200, unique=True, description="URL别名")
|
||
content = fields.TextField(description="文章内容(Markdown)")
|
||
summary = fields.TextField(null=True, description="文章摘要")
|
||
cover_image = fields.CharField(max_length=500, null=True, description="封面图片URL")
|
||
|
||
# 关联用户(作者)
|
||
author = fields.ForeignKeyField(
|
||
"models.User",
|
||
related_name="posts",
|
||
on_delete=fields.CASCADE,
|
||
description="作者"
|
||
)
|
||
|
||
# 关联分类
|
||
category = fields.ForeignKeyField(
|
||
"models.Category",
|
||
related_name="posts",
|
||
on_delete=fields.SET_NULL,
|
||
null=True,
|
||
description="分类"
|
||
)
|
||
|
||
# 标签(多对多)
|
||
tags = fields.ManyToManyField(
|
||
"models.Tag",
|
||
related_name="posts",
|
||
through="post_tags",
|
||
description="标签"
|
||
)
|
||
|
||
# 统计数据
|
||
view_count = fields.IntField(default=0, description="浏览量")
|
||
like_count = fields.IntField(default=0, description="点赞数")
|
||
comment_count = fields.IntField(default=0, description="评论数")
|
||
|
||
# 状态:draft(草稿), published(已发布), archived(已归档)
|
||
status = fields.CharField(
|
||
max_length=20,
|
||
default="draft",
|
||
description="文章状态"
|
||
)
|
||
|
||
# SEO
|
||
meta_title = fields.CharField(max_length=200, null=True, description="SEO标题")
|
||
meta_description = fields.TextField(null=True, description="SEO描述")
|
||
|
||
# 时间戳
|
||
published_at = fields.DatetimeField(null=True, description="发布时间")
|
||
created_at = fields.DatetimeField(auto_now_add=True, description="创建时间")
|
||
updated_at = fields.DatetimeField(auto_now=True, description="更新时间")
|
||
|
||
class Meta:
|
||
table = "posts"
|
||
ordering = ["-created_at"]
|
||
indexes = [
|
||
("status", "published_at"),
|
||
("author", "status"),
|
||
]
|
||
|
||
def __str__(self):
|
||
return self.title
|
||
|
||
|
||
class PostTag(models.Model):
|
||
"""文章-标签关联表"""
|
||
|
||
id = fields.UUIDField(pk=True, default=uuid.uuid4)
|
||
post = fields.ForeignKeyField(
|
||
"models.Post",
|
||
on_delete=fields.CASCADE,
|
||
description="文章"
|
||
)
|
||
tag = fields.ForeignKeyField(
|
||
"models.Tag",
|
||
on_delete=fields.CASCADE,
|
||
description="标签"
|
||
)
|
||
|
||
class Meta:
|
||
table = "post_tags"
|
||
unique_together = (("post", "tag"),)
|