当前位置: 代码网 > it编程>编程语言>其他编程 > FastAPI中如何高效实现类似Django filter的范围查询?

FastAPI中如何高效实现类似Django filter的范围查询?

2025年03月29日 其他编程 我要评论
本文介绍如何在fastapi中高效实现类似django filter的范围查询功能,以简化数据库查询条件的构建。 django的django-filter库提供了便捷的范围查询,而fastapi则需

fastapi中如何高效实现类似django filter的范围查询?

本文介绍如何在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的范围查询?的详细内容,更多请关注代码网其它相关文章!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com