我有一个 pydantic 模型,我想动态排除其中的字段。
我可以通过覆盖dict模型上的函数来做到这一点,以便它可以采用我的自定义标志,例如:
class MyModel(BaseModel):
field: str
def dict(self, **kwargs):
if ('exclude_special_fields' in kwargs):
super().dict(exclude={"field": True}, **kwargs)
super().dict(**kwargs)
Run Code Online (Sandbox Code Playgroud)
.dict但是,如果我的模型是调用它的另一个模型的子模型,则这不起作用:
class AnotherModel(BaseModel):
models: List[MyModel]
AnotherModel(models=[...]).dict(exclude_special_fields=True) # does not work
Run Code Online (Sandbox Code Playgroud)
这是因为当MyModel.dict()调用时,它不会使用与父级相同的参数来调用。
我dict也可以在父模型上编写一个覆盖,以指定任何子组件的排除(例如exclude={"models": {"__all__": {"field": True}}}),但在我的现实世界示例中,我有许多使用这个子模型的父模型,并且我不想让为每一个写一个覆盖。
无论如何,我可以确保子模型知道何时排除字段吗?
额外的上下文
额外的上下文对于问题来说并不完全重要,但我想要这样做的原因是排除模型上的某些字段(如果它从 API 调用返回)。
我在 VS Code 中打开一个 monorepo 文件夹,其中顶部文件夹是不同的服务。其中一项服务是使用诗歌来安装依赖项的 python 服务。
我正在使用诗歌的in-project=true virtualenv设置,以便所有依赖项实际上都存储在./python-service/.venv.
monorepo 可以使用 docker-compose 文件在本地运行。因此,任何依赖项安装都是在容器上完成的。
VS Code 不会自动检测这个虚拟环境,但是手动设置时,会立即出错:
Linter 'flake8' is not installed. Please install it or select another linter".
Error: spawn /Users/me/dev/project/python-service/.venv/bin/python EACCES
Run Code Online (Sandbox Code Playgroud)
如果我查看该./python-service/.venv/bin/python文件,我可以看到它实际上是一个符号链接,指向的符号链接/usr/local/bin/python在我的计算机上不存在,仅在容器上存在。
由于 VS Code 在我的计算机上运行,而不是在容器上运行,因此它无法遵循此符号链接是有道理的。
我考虑过两种选择:
always-copy virtualenv选项。由于某种原因,这实际上并没有复制python二进制文件(由其他人复制)。所以这实际上并不能解决这个问题。配置诗歌/vscode/docker 以确保可以在 VS Code 中设置解释器的正确方法是什么?
我正在尝试自动将 Pydantic 模型转换为数据库模式。为此,我递归地循环遍历 Pydantic 模型的字段以确定字段的类型。
作为一个例子,我有这个简单的模型:
from typing import List
from pydantic import BaseModel
class TestModel(BaseModel):
tags: List[str]
Run Code Online (Sandbox Code Playgroud)
__fields__我使用此处描述的属性递归模型: https ://docs.pydantic.dev/usage/models/#model-properties
如果我这样做,type(TestModel).__fields__['tags']我会看到:
ModelField(name='tags', type=List[str], required=True)
Run Code Online (Sandbox Code Playgroud)
我想以编程方式检查该ModelField类型是否有List起源。我尝试过以下方法,但没有一个有效:
type(TestModel).__fields__['tags'].type_ is List[str]type(TestModel).__fields__['tags'].type_ == List[str]typing.get_origin(type(TestModel).__fields__['tags'].type_) is Listtyping.get_origin(type(TestModel).__fields__['tags'].type_) == List令人沮丧的是,这确实返回True:
type(TestModel).__fields__['tags'].type_ is str我确认字段是List类型的正确方法是什么?
我有一个非常复杂的 pydantic 模型,其中有很多嵌套的 pydantic 模型。我想确保某些字段永远不会作为 API 调用的一部分返回,但我希望这些字段用于内部逻辑。
我首先尝试使用 pydantic 的Field函数来指定exclude我不想返回的字段上的标志。这有效,但是我的内部逻辑中的函数每当.dict()通过调用.dict(exclude=None).
相反,我return_in_api在 上指定了一个自定义标志Field,目标是仅在 FastAPI 调用时应用排除.dict()。我尝试编写一个中间件来根据包含的嵌套字段来调用.dict()和传递我自己的属性。然而,FastAPI 的中间件为我提供了一个响应流,我不想过早地解析它。excludereturn_in_api=False
相反,我编写了一个装饰器,它.dict()使用适当的值调用路由处理程序的返回值exclude。
一个挑战是,每当添加新端点时,添加它们的人都必须记住包含此装饰器,否则字段会泄漏。
理想情况下,我想将此装饰器应用于每个路由,但通过中间件执行此操作似乎会破坏响应流。
下面的例子:
我想在中间保留一个固定区域,circle通过它来设置 svg的动画。
我见过的大多数示例都涉及某种合并,最终显示原始圆圈和模糊版本。让我做这样的事情:
<clipPath id="top-mask">
<rect id="top-mask-rect" x="0" y="-100" width="100" height="100" />
</clipPath>
<filter id="top-blur" x="-200%" y="-200%" width="500%" height="500%">
<feimage xlinkHref="url(#top-mask)" result="mask" />
<feGaussianBlur stdDeviation="1.5" result="blur" />
<feComposite in2="mask" in="blur" operator="in" result="comp" />
<feMerge result="merge">
<feMergeNode in="SourceGraphic" />
<feMergeNode in="comp" />
</feMerge>
</filter>
Run Code Online (Sandbox Code Playgroud)
这似乎将圆圈覆盖在略微模糊的版本之上。我的下一个天真的步骤是删除feComposite,而是应用于根本不起作用的clipPath两者feMergeNode。
解决这个问题的正确方法是什么?
我现在在两台不同的机器上都遇到这个问题。
版本63.0.3239.84(官方内部版本)(64位)OSX 10.12.6
Chrome浏览器会持续在上加载旧的缓存文件http://localhost:3000。我可以阻止它的唯一方法是使用隐身模式。如果我使用cmd + shift + r它可以进行一次刷新,然后在重新加载时返回到旧文件。
我通常会把检查员调高,所以我尝试打勾disable cache,这没什么。我还尝试通过chrome的设置删除我的缓存文件,但此操作无济于事。
我在这里想念什么吗?