当前位置: 首页 > 知识库问答 >
问题:

根据字段的值使用不同的比例模型

陶宜民
2023-03-14

我有两个Pydantic模型(< code>var1和< code>var2)。< code>PostExample方法的输入可以接收第一个模型或第二个模型的数据。使用< code>Union有助于解决这个问题,但是在验证期间,它会对第一个和第二个模型都抛出错误。

如何使其在填写字段时发生错误时,仅为某个模型返回验证器错误,而不是同时为两个模型返回?(如果有帮助,可以通过字段A的长度来区分模型)。

main.py

@app.post("/PostExample")
def postExample(request: Union[schemas.var1, schemas.var2]):
    
    result = post_registration_request.requsest_response()
    return result
  
  

架构.py

class var1(BaseModel):
    A: str
    B: int
    C: str
    D: str
  
  
class var2(BaseModel):
    A: str
    E: int
    F: str

共有1个答案

齐泰
2023-03-14

您可以使用受歧视的工会(感谢@larsks在评论中提及这一点)。设置一个可区分的联合,“验证更快,因为它只针对一个模型尝试”,以及“在失败的情况下只引发一个显式错误”。工作示例如下:

app.py

import schemas
from fastapi import FastAPI, Body
from typing import Union

app = FastAPI()

@app.post("/")
def submit(item: Union[schemas.Model1, schemas.Model2] = Body(..., discriminator='model_type')):
    return item

架构.py

from typing import Literal
from pydantic import BaseModel

class Model1(BaseModel):
    model_type: Literal['m1']
    A: str
    B: int
    C: str
    D: str
  
class Model2(BaseModel):
    model_type: Literal['m2']
    A: str
    E: int
    F: str

测试输入-输出

#1 Successful Response   #2 Validation error                   #3 Validation error
                                          
# Request body           # Request body                        # Request body
{                        {                                     {
  "model_type": "m1",      "model_type": "m1",                   "model_type": "m2",
  "A": "string",           "A": "string",                        "A": "string",
  "B": 0,                  "C": "string",                        "C": "string",
  "C": "string",           "D": "string"                         "D": "string"
  "D": "string"          }                                     }
}                                                              
                        
# Server response        # Server response                     # Server response
200                      {                                     {
                           "detail": [                           "detail": [
                             {                                     {
                               "loc": [                              "loc": [
                                 "body",                               "body",
                                 "Model1",                             "Model2",
                                 "B"                                   "E"
                               ],                                    ],
                               "msg": "field required",              "msg": "field required",
                               "type": "value_error.missing"         "type": "value_error.missing"
                             }                                     },
                           ]                                       {
                         }                                           "loc": [
                                                                       "body",
                                                                       "Model2",
                                                                       "F"
                                                                     ],
                                                                     "msg": "field required",
                                                                     "type": "value_error.missing"
                                                                   }
                                                                 ]
                                                               }

另一种方法是尝试解析模型(基于您作为查询/路径参数传递的鉴别器),如此处所述(更新 1)。

 类似资料:
  • 我正在尝试使用elasticsearch搜索产品。例如,如果产品是汽车,它将有一些字段,如“颜色”,“品牌”,“型号”,“公里”,……如果它是衣服,它将只有“颜色”,“尺寸”,……我想在弹性索引所有这些信息,以便能够搜索公里在aaa公里和bbb公里之间的汽车,和/或xxxx型号,相同的衣服或任何其他产品。 如何在elasticsearch中创建这样的字段?我希望所有的产品在相同的索引,这样用户可以

  • 问题内容: 我想知道模式草案03是否可行。我已经在其他地方使用了依赖项,我认为可能需要创造性地使用它们,以便使用它们来指定某些字段的属性。 我目前的最佳尝试(无效)将使您对我的追求有所了解。我想要一个默认值,当另一个字段具有特定值时是可选值。 问题答案: 草案的第3版绝对可以做到这一点。由于您具有允许的国家/地区的完整列表,因此您可以执行以下操作: 因此,您实际上为架构定义了两种子类型,一种用于需

  • 问题内容: 我一直努力在flask-admin中实现的一个功能是,当用户编辑表单时,一旦设置了字段1,便会约束字段2的值。 让我用语言给出一个简化的示例(实际用例更加复杂)。然后,我将展示实现该示例的完整要点,减去“约束”功能。 假设我们有一个数据库,该数据库跟踪一些软件“配方”以输出各种格式的报表。我们的示例数据库的表有两个配方:“严重报告”,“ ASCII艺术”。 为了实现每种配方,我们从几种

  • 我有一个使用Java和Gson运行的rest API,并有一项任务来标准化字段的名称。不幸的是,它们是用我的母语创建的,现在需要改成英语。我在想,我可以支持旧版本,传递旧的字段名。 是否可以将@Since注释与@SerializedName一起使用?或者根据版本动态更改字段名的任何解决方案?

  • 问题内容: 示例: File.txt的内容: 当使用’sort -k 1,1 File.txt’时,行的顺序不会改变,尽管我们期望: 如何根据绝对 数值 对包含数字的字段进行排序? 问题答案: 看看手册页进行排序 … 所以这是一个例子…

  • 问题内容: 我有一张桌子叫: 每个都与一个不同的表相关,field的值指定了我要用于该表的表的名称。所有目标表都有几个相似的列: 当前,我正在使用此查询来选择通知,通知它们在目标表中存在相关行,并且其字段为: 但是由于它是a ,如果它与任何表都不匹配,它将返回通知,我该如何重写它,以便它不返回与目标表中的任何行都不匹配的通知?我也尝试了不成功的声明。 问题答案: 我不是100%肯定语法正确,并且现