
本文介绍如何在fastapi中高效实现类似django filter的范围查询功能,以简化数据库查询条件的构建。 django的django-filter库提供了便捷的范围查询,而fastapi则需要结合pydantic模型和sqlalchemy等orm框架来实现。
以下是一种基于sqlalchemy的实现方法:
首先,定义一个pydantic模型来接收前端的查询参数:
from pydantic import basemodel
from typing import optional, list
from datetime import date
class seriesfilter(basemodel):
company: optional[list[int]] = none
confirm_start: optional[date] = none
confirm_end: optional[date] = none
score_min: optional[int] = none
score_max: optional[int] = none接下来,在fastapi路由函数中,使用接收到的参数构建sqlalchemy查询:
from fastapi import fastapi, depends
from sqlalchemy import create_engine, text, func
from sqlalchemy.orm import session
from database import base, engine, get_db # 假设数据库连接和模型定义在database.py中
from models import series # 假设series是你的数据库模型
app = fastapi()
base.metadata.create_all(bind=engine)
@app.get("/series/")
async def read_series(filter_params: seriesfilter = depends(get_db)): #get_db函数需要返回一个数据库session
with session(engine) as db:
query = db.query(series)
if filter_params.company:
query = query.filter(series.company_id.in_(filter_params.company))
if filter_params.confirm_start:
query = query.filter(series.confirm_at >= filter_params.confirm_start)
if filter_params.confirm_end:
query = query.filter(series.confirm_at <= filter_params.confirm_end)
if filter_params.score_min:
query = query.filter(series.rating_score >= filter_params.score_min)
if filter_params.score_max:
query = query.filter(series.rating_score <= filter_params.score_max)
results = query.all()
return results
#示例get_db函数
def get_db():
db = sessionlocal()
try:
yield db
finally:
db.close()
# 假设的数据库模型(database.py)
from sqlalchemy import column, integer, string, date
from sqlalchemy.ext.declarative import declarative_base
base = declarative_base()
class series(base):
__tablename__ = "series"
id = column(integer, primary_key=true, index=true)
company_id = column(integer)
confirm_at = column(date)
rating_score = column(integer)
# ... other columns这段代码根据seriesfilter模型中的参数动态构建sqlalchemy查询条件。 get_db 函数是一个依赖注入函数,负责创建和管理数据库会话。 请根据你的实际数据库连接信息和模型定义修改database.py和models.py文件。 错误已更正,confirm_at 和 rating_score 的比较操作符已修正。 此方法需要你熟悉sqlalchemy的使用。 其他orm框架,例如sqlmodel,也可以实现类似的功能。
以上就是fastapi中如何高效实现类似django filter的范围查询?的详细内容,更多请关注代码网其它相关文章!
发表评论