在FastAPI中,我遇到了类似的情况:

models.py

class MachineGroups(Base):
    __tablename__ = 'MachineGroups'

    MachineGroupsId = Column(NVARCHAR(25), primary_key=True)
    Description = Column(NVARCHAR(255))


class Machines(Base):
    __tablename__ = 'Machines'

    MachinesId = Column(NVARCHAR(50), primary_key=True)
    Description = Column(NVARCHAR(255))
    MachineGroupsId = Column(NVARCHAR(25), ForeignKey("MachineGroups.MachineGroupsId", ondelete="SET NULL"), nullable=True)

    group = relationship("MachineGroups")

schemas.py

class MachineGroups(BaseModel):
    MachineGroupsId: str
    Description: str

    class Config:
        orm_mode = True


class Machines(BaseModel):
    MachinesId: str
    Description: str
    MachineGroupsId: str = None
    group: Optional[MachineGroups] = None

    class Config:
        orm_mode = True

在控制器中,我有一个如下创建的函数:

controller.py

@app.get(
    "/machines",
    response_model=List[machine_schemas.Machines],
    response_model_exclude={'group'}
)
def get_machines(db: Session = Depends(get_db)):
    return db.query(machine_models.Machines).all()

我希望能够直接从API调用中设置decorator中的response_model_exclude字段值.实际上,我希望在函数上有一个查询参数,该参数允许我获取外键信息或不获取外键信息.

为避免出现这种情况:

@app.get(
    "/machines",
    response_model=List[machine_schemas.Machines],
    response_model_exclude={'group'}
)
def get_machines(db: Session = Depends(get_db)):
    return db.query(machine_models.Machines).all()

@app.get(
    "/machines/all",
    response_model=List[machine_schemas.Machines],
)
def get_machines_all(db: Session = Depends(get_db)):
    return db.query(machine_models.Machines).all()

有可能做到这一点吗?

非常感谢.

推荐答案

我通过创建一个自定义JSONResponse并使用jsonable_encoder函数排除外键字段,解决了这个问题.

@app.get(
    "/machines/all",
    response_model=List[machine_schemas.Machines],
)
def get_machines_all(get_foreign_keys: bool = True, db: Session = Depends(get_db)):
    machines = db.query(machine_models.Machines).all()
    if get_foreign_keys:
        return machines
    else:
        return JSONResponse(jsonable_encoder(machines, exclude={'group'}))

Python-3.x相关问答推荐

如何定义既允许固定单词又允许模式的pydanti.BaseModel?

如何在M x N数组的行中找到所有值的组合

为什么不能用格式字符串 '-' 绘制点?

Python多进程:运行一个类的多个实例,将所有子进程保留在内存中

有效地缩短列表,直到第一次和最后一次出现不同于 None 的值

列表中的重复数字与列表理解

二进制文件的 Python 3 和 base64 编码

Python 异步调试示例

如何在 Python 3 中通过 IP 获取 WhoIs 信息?

TensorFlow:dataset.train.next_batch 是如何定义的?

Python3四舍五入到最接近的偶数

如何在 Python3 中添加带有标志的命令行参数?

作为函数对象属性的 __kwdefaults__ 有什么用?

如何将 Matplotlib 图形转换为 PIL Image 对象(不保存图像)

变量类型注解NameError不一致

如何使用已打开并使用登录凭据登录的浏览器

如何强制 Sphinx 使用 Python 3.x 解释器

新项目:Python 2 还是 Python 3?

Python 2 与 Python 3 - urllib 格式

有效地判断一个元素是否在列表中至少出现 n 次