扫描二维码
关注或者微信搜一搜:编程智域 前端至全栈交流与成长
发现1000+提升效率与开发的AI工具和实用程序:https://tools.cmdragon.cn/
# 使用pydantic定义数据模型
from pydantic import BaseModel
class UserProfile(BaseModel):
id: int
username: str
age: int = Field(ge=18, description="必须年满18岁")
email: str = Field(pattern=r"^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+.[a-zA-Z0-9-.]+$")
from enum import Enum
class UserStatus(str, Enum):
ACTIVE = "active"
INACTIVE = "inactive"
SUSPENDED = "suspended"
# 输入模型(接收客户端数据)
class UserCreate(BaseModel):
username: str
password: str
# 输出模型(返回响应数据)
class UserOut(BaseModel):
id: int
username: str
create_time: datetime
# RESTful端点示例
@app.get("/users/{user_id}")
def get_user(user_id: int):
# ...
# GraphQL等效查询
type Query {
getUser(userId: Int!): User
}
# 安装依赖:fastapi==0.95.2 strawberry-graphql==0.155.3 pydantic==1.10.7
from fastapi import FastAPI
import strawberry
from strawberry.asgi import GraphQL
@strawberry.type
class Product:
id: int
name: str
price: float
@strawberry.type
class Query:
@strawberry.field
def get_product(self, id: int) -> Product:
# 实际应从数据库获取
return Product(id=id, name="Sample", price=99.9)
schema = strawberry.Schema(query=Query)
app = FastAPI()
app.add_route("/graphql", GraphQL(schema))
Q1:如何定义返回手机号格式的字段?
A) 使用String类型
B) 使用正则表达式校验
C) 创建自定义标量类型
正确答案:C。可通过定义标量类型实现格式验证:
@strawberry.scalar
class PhoneNumber:
@staticmethod
def serialize(value: str) -> str:
if not re.match(r'^1[3-9]d{9}$', value):
raise ValueError("Invalid phone number")
return value
报错处理
问题:查询返回"ValueError: Expected 'User' type"
解决方案:
余下文章内容请点击跳转至 个人博客页面 或者 扫码关注或者微信搜一搜:编程智域 前端至全栈交流与成长
,阅读完整的文章:GraphQL类型系统如何让FastAPI开发更高效?
参与评论
手机查看
返回顶部