在FastAPI中实现类似Django-filter的大于、小于等范围筛选功能,可以通过使用Pydantic模型和SQLAlchemy(或其他ORM)来实现。以下是一个高效的实现方案:
首先,确保你已经安装了FastAPI、SQLAlchemy和Pydantic:
pip install fastapi sqlalchemy pydantic
定义一个Pydantic模型来处理查询参数,用于接收大于、小于等范围筛选条件。
from pydantic import BaseModel, Field
from typing import Optional
class FilterParams(BaseModel):
min_value: Optional[int] = Field(None, description="最小值")
max_value: Optional[int] = Field(None, description="最大值")
定义一个SQLAlchemy模型来表示数据库中的表。
from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
DATABASE_URL = "sqlite:///./test.db"
engine = create_engine(DATABASE_URL)
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
Base = declarative_base()
class Item(Base):
__tablename__ = "items"
id = Column(Integer, primary_key=True, index=True)
name = Column(String, index=True)
value = Column(Integer)
在FastAPI应用中,使用Pydantic模型接收查询参数,并根据这些参数构建SQLAlchemy查询。
from fastapi import FastAPI, Depends, Query
from sqlalchemy.orm import Session
app = FastAPI()
# 依赖项,用于获取数据库会话
def get_db():
db = SessionLocal()
try:
yield db
finally:
db.close()
@app.get("/items/")
def get_items(
filter_params: FilterParams = Depends(),
db: Session = Depends(get_db)
):
query = db.query(Item)
if filter_params.min_value is not None:
query = query.filter(Item.value >= filter_params.min_value)
if filter_params.max_value is not None:
query = query.filter(Item.value <= filter_params.max_value)
items = query.all()
return items
运行FastAPI应用,并访问/items/
端点,传入min_value
和max_value
参数进行筛选。
uvicorn main:app --reload
你可以通过以下方式请求数据:
获取所有value
大于等于10的项:
GET /items/?min_value=10
获取所有value
小于等于20的项:
GET /items/?max_value=20
获取所有value
在10到20之间的项:
GET /items/?min_value=10&max_value=20
你可以根据需要扩展FilterParams
模型,添加更多的筛选条件,并在查询中应用这些条件。
通过使用Pydantic模型和SQLAlchemy,你可以在FastAPI中高效地实现类似Django-filter的大于、小于等范围筛选功能。这种方法灵活且易于扩展,适用于各种复杂的查询场景。