赞
踩
官方文档研究 FastAPI Examples - Tortoise ORM v0.20.0 Documentation
网上好多教程都是手动封装Pydantic,不仅代码繁琐,后期改动也很麻烦,还是推荐使用ORM的模块,虽然会费事研究,但是后续提高开发效率。
对官方代码做了适当的改动,否则程序会报错
models.py
- from tortoise import fields, models
- from tortoise.contrib.pydantic import pydantic_model_creator
-
-
- class Users(models.Model):
- """
- The User model
- """
-
- id = fields.IntField(pk=True)
- #: This is a username
- username = fields.CharField(max_length=20, unique=True)
- name = fields.CharField(max_length=50, null=True)
- family_name = fields.CharField(max_length=50, null=True)
- category = fields.CharField(max_length=30, default="misc")
- password_hash = fields.CharField(max_length=128, null=True)
- created_at = fields.DatetimeField(auto_now_add=True)
- modified_at = fields.DatetimeField(auto_now=True)
-
- def full_name(self) -> str:
- """
- Returns the best name
- """
- if self.name or self.family_name:
- return f"{self.name or ''} {self.family_name or ''}".strip()
- return self.username
-
- # 这块要认真研究
- class PydanticMeta:
- computed = ["full_name"]
- exclude = ["password_hash"]
-
-
- User_Pydantic = pydantic_model_creator(Users, name="User")
- UserIn_Pydantic = pydantic_model_creator(Users, name="UserIn", exclude=("id", "created_at", "modified_at"))
- # 原始代码没有参数exclude=("id", "created_at", "modified_at")
- # 执行添加报错
main.py
- from typing import List
-
- from fastapi import FastAPI
- from models import User_Pydantic, UserIn_Pydantic, Users
- from pydantic import BaseModel
- from starlette.exceptions import HTTPException
-
- from tortoise.contrib.fastapi import register_tortoise
-
- app = FastAPI(title="Tortoise ORM FastAPI example")
-
-
- class Status(BaseModel):
- message: str
-
-
- @app.get("/users", response_model=List[User_Pydantic])
- async def get_users():
- return await User_Pydantic.from_queryset(Users.all())
-
-
- @app.post("/users", response_model=User_Pydantic)
- async def create_user(user: UserIn_Pydantic):
- user_obj = await Users.create(**user.model_dump(exclude_unset=True))
- return await User_Pydantic.from_tortoise_orm(user_obj)
-
-
- @app.get("/user/{user_id}", response_model=User_Pydantic)
- async def get_user(user_id: int):
- return await User_Pydantic.from_queryset_single(Users.get(id=user_id))
-
-
- @app.put("/user/{user_id}", response_model=User_Pydantic)
- async def update_user(user_id: int, user: UserIn_Pydantic):
- await Users.filter(id=user_id).update(
- **user.model_dump(exclude_unset=False, exclude='full_name'))
- return await User_Pydantic.from_queryset_single(Users.get(id=user_id))
-
-
- @app.delete("/user/{user_id}", response_model=Status)
- async def delete_user(user_id: int):
- deleted_count = await Users.filter(id=user_id).delete()
- if not deleted_count:
- raise HTTPException(status_code=404, detail=f"User {user_id} not found")
- return Status(message=f"Deleted user {user_id}")
-
-
- register_tortoise(
- app,
- db_url="sqlite://:memory:",
- modules={"models": ["models"]},
- generate_schemas=True,
- add_exception_handlers=True,
- )
项目启动后就可以任意测试了,后期再慢慢优化
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。