IT评测·应用市场-qidao123.com技术社区
标题:
使用Tortoise-ORM和FastAPI构建评论系统
[打印本页]
作者:
熊熊出没
时间:
6 天前
标题:
使用Tortoise-ORM和FastAPI构建评论系统
title: 使用Tortoise-ORM和FastAPI构建评论系统
date: 2025/04/25 21:37:36
updated: 2025/04/25 21:37:36
author: cmdragon
excerpt:
在models.py中定义了Comment模子,包罗id、content、created_at、updated_at字段,并与User和Article模子建立外键关系。schemas.py中定义了CommentBase、CommentCreate、CommentUpdate和CommentResponse等Pydantic模子,用于数据验证和响应。路由层实现了创建、获取和删除评论的API,使用get_or_none处理不存在的评论,并捕获异常。测试接口通过requests举行创建和异常测试。常见报错包括外键约束失败、验证错误和事件循环未关闭,需检查外键值、哀求体匹配和正确关闭事件循环。
categories:
后端开发
FastAPI
tags:
Tortoise-ORM
Pydantic
FastAPI
评论系统
数据库模子
数据验证
接口测试
扫描
二维码
关注大概微信搜一搜:编程智域 前端至全栈交流与发展
探索数千个预构建的 AI 应用,开启你的下一个巨大创意
:
https://tools.cmdragon.cn/
一、Tortoise-ORM模子定义
我们起首在models.py中定义评论模子:
from tortoise.models import Model
from tortoise import fields
class Comment(Model):
id = fields.IntField(pk=True)
content = fields.TextField()
created_at = fields.DatetimeField(auto_now_add=True)
updated_at = fields.DatetimeField(auto_now=True)
# 外键关系
user = fields.ForeignKeyField('models.User', related_name='comments')
article = fields.ForeignKeyField('models.Article', related_name='comments')
class Meta:
table = "comments"
indexes = ("created_at", "user_id", "article_id")
def __str__(self):
return f"Comment {self.id} by {self.user.username}"
复制代码
代码解析:
auto_now_add会在创建时自动记录时间
通过related_name建立双向关联查询路径
复合索引提升常用查询条件的效率
继承Model基类获得ORM本领
二、Pydantic模子定义
在schemas.py中定义数据验证模子:
from pydantic import BaseModel
from datetime import datetime
class CommentBase(BaseModel):
content: str
user_id: int
article_id: int
class CommentCreate(CommentBase):
pass
class CommentUpdate(BaseModel):
content: str
class CommentResponse(CommentBase):
id: int
created_at: datetime
updated_at: datetime
class Config:
orm_mode = True
复制代码
验证要点:
创建模子继承自基础模子
更新模子仅允许修改内容字段
响应模子启用orm_mode以兼容ORM对象
时间字段自动转换时间格式
三、路由层实现
核心路由实现在comments.py中:
from fastapi import APIRouter, Depends, HTTPException
from .models import Comment
from .schemas import CommentCreate, CommentResponse
router = APIRouter(prefix="/comments", tags=["comments"])
@router.post("/", response_model=CommentResponse)
async def create_comment(comment: CommentCreate):
try:
comment_obj = await Comment.create(**comment.dict())
return await CommentResponse.from_tortoise_orm(comment_obj)
except Exception as e:
raise HTTPException(
status_code=400,
detail=f"创建评论失败: {str(e)}"
)
@router.get("/{comment_id}", response_model=CommentResponse)
async def get_comment(comment_id: int):
comment = await Comment.get_or_none(id=comment_id)
if not comment:
raise HTTPException(status_code=404, detail="评论不存在")
return comment
@router.delete("/{comment_id}")
async def delete_comment(comment_id: int):
deleted_count = await Comment.filter(id=comment_id).delete()
if not deleted_count:
raise HTTPException(status_code=404, detail="评论不存在")
return {"message": "评论删除成功"}
复制代码
技术要点:
使用get_or_none替换get制止直接抛出异常
批量删除返回影响行数作为判断依据
异常处理覆盖数据库操作的各种失败场景
四、测试接口
使用requests测试接口:
import requests
BASE_URL = "http://localhost:8000/comments"
# 创建测试
def test_create_comment():
data = {
"content": "优质技术文章!",
"user_id": 1,
"article_id": 1
}
response = requests.post(BASE_URL, json=data)
assert response.status_code == 200
print(response.json())
# 异常测试
def test_invalid_user():
data = {
"content": "错误测试",
"user_id": 999,
"article_id": 1
}
response = requests.post(BASE_URL, json=data)
assert response.status_code == 400
print(response.json())
复制代码
五、课后Quiz
当查询不存在的评论ID时,应该返回什么HTTP状态码?
A) 200
B) 404
C) 500
D) 400
答案:B) 404。get_or_none方法会返回None,触发自定义的404异常
如何实现评论的软删除功能?
A) 直接删除数据库记录
B) 添加is_deleted字段
C) 使用数据库回收站功能
D) 修改内容为"已删除"
答案:B) 添加布尔型is_deleted字段,查询时过滤已删除的记录
六、常见报错处理
报错:tortoise.exceptions.IntegrityError: FOREIGN KEY constraint failed
缘故原由:实验关联不存在的用户或文章ID
解决:检查外键值是否存在,添加数据库约束
报错:pydantic.error_wrappers.ValidationError
缘故原由:哀求体缺少必填字段或字段类型错误
解决:检查哀求体是否匹配schema定义,使用try-except捕获验证错误
报错:RuntimeError: Event loop is closed
缘故原由:异步操作未正确关闭
解决:在main.py中添加关闭事件循环的hook:
from fastapi import FastAPI
from tortoise.contrib.fastapi import register_tortoise
app = FastAPI()
register_tortoise(
app,
db_url="sqlite://db.sqlite3",
modules={"models": ["app.models"]},
generate_schemas=True,
add_exception_handlers=True,
)
复制代码
余下文章内容请点击跳转至 个人博客页面 大概 扫码关注大概微信搜一搜:编程智域 前端至全栈交流与发展,阅读完整的文章:
使用Tortoise-ORM和FastAPI构建评论系统 | cmdragon's Blog
往期文章归档:
分层架构在博客评论功能中的应用与实现 | cmdragon's Blog
深入解析事件基础与原子操作原理 | cmdragon's Blog
掌握Tortoise-ORM高级异步查询技巧 | cmdragon's Blog
FastAPI与Tortoise-ORM实现关系型数据库关联 | cmdragon's Blog
Tortoise-ORM与FastAPI集成:异步模子定义与实践 | cmdragon's Blog
异步编程与Tortoise-ORM框架 | cmdragon's Blog
FastAPI数据库集成与事件管理 | cmdragon's Blog
FastAPI与SQLAlchemy数据库集成 | cmdragon's Blog
FastAPI与SQLAlchemy数据库集成与CRUD操作 | cmdragon's Blog
FastAPI与SQLAlchemy同步数据库集成 | cmdragon's Blog
SQLAlchemy 核心概念与同步引擎设置详解 | cmdragon's Blog
FastAPI依赖注入性能优化战略 | cmdragon's Blog
FastAPI安全认证中的依赖组合 | cmdragon's Blog
FastAPI依赖注入系统及调试技巧 | cmdragon's Blog
FastAPI依赖覆盖与测试情况模拟 | cmdragon's Blog
FastAPI中的依赖注入与数据库事件管理 | cmdragon's Blog
FastAPI依赖注入实践:工厂模式与实例复用的优化战略 | cmdragon's Blog
FastAPI依赖注入:链式调用与多级参数通报 | cmdragon's Blog
FastAPI依赖注入:从基础概念到应用 | cmdragon's Blog
FastAPI中实现动态条件必填字段的实践 | cmdragon's Blog
FastAPI中Pydantic异步分布式唯一性校验 | cmdragon's Blog
掌握FastAPI与Pydantic的跨字段验证技巧 | cmdragon's Blog
FastAPI中的Pydantic密码验证机制与实现 | cmdragon's Blog
深入掌握FastAPI与OpenAPI规范的高级适配技巧 | cmdragon's Blog
Pydantic字段元数据指南:从基础到企业级文档增强 | cmdragon's Blog
Pydantic Schema生成指南:自定义JSON Schema | cmdragon's Blog
Pydantic递归模子深度校验36计:从无穷嵌套到亿级数据的优化法则 | cmdragon's Blog
Pydantic异步校验器深:构建高并发验证系统 | cmdragon's Blog
Pydantic根校验器:构建跨字段验证系统 | cmdragon's Blog
Pydantic设置继承抽象基类模式 | cmdragon's Blog
Pydantic多态模子:用鉴别器构建类型安全的API接口 | cmdragon's Blog
FastAPI性能优化指南:参数解析与惰性加载 | cmdragon's Blog
FastAPI依赖注入:参数共享与逻辑复用 | cmdragon's Blog
FastAPI安全防护指南:构建坚如盘石的参数处理体系 | cmdragon's Blog
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
欢迎光临 IT评测·应用市场-qidao123.com技术社区 (https://dis.qidao123.com/)
Powered by Discuz! X3.4