Python FastAPI:拥有超类模型 .dict() 还包括子类键
Python FastAPI: Having a superclass model .dict() also include the subclass keys
为 Python 3.7+ 使用 FastAPI 我有以下 BaseDocument class:
class BaseDocument(BaseModel):
name: str
category: str
description = "Base Document"
type: str
class Config:
schema_extra = {
"example": {
"name": "stack_instance_document_example",
"description":
"an example of a document, using the stack_instance type",
"example_field": "Random",
"category": "items",
"type": "example_document"
}
}
还有一个子classing模型:
class ExampleModel(BaseModel):
name: str
type = "example_document"
category = "items"
"example_field": str
现在,如果我使用 class_config 模式额外示例执行一个 API 调用,我期待一个 BaseDocument 并且我在该 BaseDocument 上使用 .dict(),结果dict 不包括 "example_field" 键。
例如,
@router.put('')
def put_document(document: BaseDocument):
"""Update (or create) the document with a specific type and an optional name given in the payload"""
logger.info(f"[PutDocument] API PUT request with data: {BaseDocument}")
task = DocumentTask({
'channel': 'worker',
'document': document.dict(),
'subtype': "PUT_DOCUMENT"
})
....
我日志中的document.dict()只有BaseDocument的字段。无论如何要获得完整文档的字典表示?
评论中的答案有效,但遗憾的是会导致缺少预填充的通用示例。
我为我的用例找到的最佳解决方案是直接使用 Request 并查看 JSON 主体(参见 https://www.starlette.io/requests/)——其中包括所有 key/values,同时保持预FastAPI
的填写示例
为 Python 3.7+ 使用 FastAPI 我有以下 BaseDocument class:
class BaseDocument(BaseModel):
name: str
category: str
description = "Base Document"
type: str
class Config:
schema_extra = {
"example": {
"name": "stack_instance_document_example",
"description":
"an example of a document, using the stack_instance type",
"example_field": "Random",
"category": "items",
"type": "example_document"
}
}
还有一个子classing模型:
class ExampleModel(BaseModel):
name: str
type = "example_document"
category = "items"
"example_field": str
现在,如果我使用 class_config 模式额外示例执行一个 API 调用,我期待一个 BaseDocument 并且我在该 BaseDocument 上使用 .dict(),结果dict 不包括 "example_field" 键。
例如,
@router.put('')
def put_document(document: BaseDocument):
"""Update (or create) the document with a specific type and an optional name given in the payload"""
logger.info(f"[PutDocument] API PUT request with data: {BaseDocument}")
task = DocumentTask({
'channel': 'worker',
'document': document.dict(),
'subtype': "PUT_DOCUMENT"
})
....
我日志中的document.dict()只有BaseDocument的字段。无论如何要获得完整文档的字典表示?
评论中的答案有效,但遗憾的是会导致缺少预填充的通用示例。 我为我的用例找到的最佳解决方案是直接使用 Request 并查看 JSON 主体(参见 https://www.starlette.io/requests/)——其中包括所有 key/values,同时保持预FastAPI
的填写示例