插件窝 干货文章 FastAPI如何高效实现类似Django-filter的大于小于范围筛选?

FastAPI如何高效实现类似Django-filter的大于小于范围筛选?

value SQLAlchemy FastAPI Pydantic 42    来源:    2025-03-13

在FastAPI中实现类似Django-filter的大于、小于等范围筛选功能,可以通过使用Pydantic模型和SQLAlchemy(或其他ORM)来实现。以下是一个高效的实现方案:

1. 安装依赖

首先,确保你已经安装了FastAPI、SQLAlchemy和Pydantic:

pip install fastapi sqlalchemy pydantic

2. 定义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="最大值")

3. 定义SQLAlchemy模型

定义一个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)

4. 创建FastAPI应用

在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

5. 运行应用

运行FastAPI应用,并访问/items/端点,传入min_valuemax_value参数进行筛选。

uvicorn main:app --reload

6. 示例请求

你可以通过以下方式请求数据:

  • 获取所有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
    

7. 扩展功能

你可以根据需要扩展FilterParams模型,添加更多的筛选条件,并在查询中应用这些条件。

总结

通过使用Pydantic模型和SQLAlchemy,你可以在FastAPI中高效地实现类似Django-filter的大于、小于等范围筛选功能。这种方法灵活且易于扩展,适用于各种复杂的查询场景。