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

2024-01-23

我有 2 个 Pydantic 模型(var1 and var2)。输入的PostExample方法可以接收第一个模型或第二个模型的数据。 指某东西的用途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

你可以使用受歧视的工会 https://pydantic-docs.helpmanual.io/usage/types/#discriminated-unions-aka-tagged-unions(感谢 @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) https://stackoverflow.com/a/71228281/17865804.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

根据字段的值使用不同的 Pydantic 模型 的相关文章

随机推荐

  • Dart 库/包关键字的含义?

    Is 飞镖库一模一样Java包 Is 飞镖包一模一样Java库 JAR 包是一组库 例如可以部署到 pub dartlang org 我猜这类似于 jar 文件 库是一个带有或不带有名称的 Dart 脚本文件 或者一组带有名称的 Dart
  • 在 Android Studio 项目中使用 libsodium

    我正在尝试在 android studio 项目中使用 libsodium 库 但是 我无法弄清楚如何做到这一点 我从 libsodium 网站下载了该库 但不明白如何创建 android studio 项目所需的库文件 任何帮助将不胜感激
  • 为什么递归函数只遍历一个子目录

    我已经找到了让我的代码正常工作的答案 但我想知道为什么它可以工作而我的代码却不能 rFunc for d in do if d d then cd d rFunc fi Do Something done 这段代码只会通过一个子目录 但如果
  • 关闭 ModalViewController 后刷新父 ViewController

    在我的 iOS 应用程序中 用户可以从列表中选择图像 然后会看到一个包含该图像和删除该图像的选项的模式 如果用户选择删除图像 她将返回到包含图像列表的原始视图控制器 然后我需要刷新原始 ViewController 以考虑已删除的图像 我尝
  • ' aria-label='无法使用以下类型的值设置 MODEL_NAME SpatialProxy (POLYGON):'> 无法使用以下类型的值设置 MODEL_NAME SpatialProxy (POLYGON):

    当我尝试对我的模型的 url 进行 API 调用时 我面临以下问题 Cannot set Allotment SpatialProxy POLYGON with value of type
  • Objective-C 中 NSArray 的子类

    我需要一个类 它具有 NSArray 的所有方法 其行为方式相同 但修改了 2 个方法 我想在我的自定义类中重写这两个方法 1 countByEnumerateWithState 对象 计数 2 对象索引 经过几个小时的研究 我没有找到任何
  • Simple_form:删除带标签的内联复选框的外部标签

    使用 Simple form 2 0 2 使用 HAML 的简单表单代码 f input remember me as boolean inline label Remember me 但它呈现出这样的效果 div class contro
  • ++、last 和 init 比 :、head 和 tail 更快?

    给出这两种编写函数来查找特定数字之前的所有素数的方法 primes1 iterate ps gt ps x x lt last ps 1 all p gt x mod p 0 ps 0 2 primesTo1 Integer gt Inte
  • 为在线商店生成订单号的最佳方法?

    我的在线商店中的每个订单都有一个面向用户的订单号 我想知道生成它们的最佳方法 标准包括 Short 通过电话很容易说出来 例如 m 和 n 是不明确的 Unique 校验和 矫枉过正 有用吗 Edit 不会透露订单总数 客户可能会因为下第三
  • 如何在 xcode 上禁用静态库的链接器警告?

    在我当前的 Swift 项目中 我有一个第 3 方静态库 是通过 构建阶段 gt 链接二进制文件与库 部分添加的 更新到 xcode 8 3 后 该库开始抛出一些链接器警告 例如 指针未在 libraryFile a 的地址 0x00000
  • 在 JavaScript 中从对象创建 DOM 元素

    嗨 我试图了解如何制作 Dom elemnt 比如说 div 形成我的数据对象 我做了一个这样的对象 var div style width Math floor Math random 100 height Math floor Math
  • 使用 Fluent NHibernate 和 guid id

    我们正在使用 Fluent NHibernate 1 2 我们的主键是保存在nvarchar 32 专栏 使用 Oracle 11gr2 我们怎样才能做到这一点 进行自动转换 谢谢 随机程序员 更新 忘了提及 保存的 guid 没有破折号
  • 启动 Facebook 转换像素

    我对 Javascript 还很陌生 但我想知道在不实际加载 确认 谢谢 页面的情况下触发 Facebook 转换像素 如下 的最佳方法是什么
  • Android 本地服务器套接字

    在android中 有两个类LocalServerSocket和LocalSocket 我认为它们类似于unix套接字中的AF LOCAL 我不确定它是否正确 我的问题是 是否可以在Java中创建LocalServerSocket并使用普通
  • Unity 在使用 Firebase 数据库进行异步编程时崩溃

    当我尝试这样做时它崩溃了 我想要异步获取用户数据 如果我不使用异步任务 它会返回 null public class Database MonoBehaviour private DatabaseReference m database p
  • Vue.js 中的计算属性未使用 navigator.onLine 更新

    我想使用 Vue js 计算属性来查看我的应用程序的在线状态 基本上 我有以下 Vue 设置 new Vue el app computed onLine function return navigator onLine 以及以下标记 di
  • 安装后如何更改应用程序的图标和标签?

    我正在尝试在安装应用程序后更改其图标和标签 在清单中 我放置了以下代码
  • UTF-8 的多字节安全 wordwrap() 函数

    PHP s wordwrap https www php net wordwrap对于 UTF 8 等多字节字符串 该函数无法正常工作 评论中有一些mb安全函数的例子 但是根据一些不同的测试数据 它们似乎都存在一些问题 该函数应采用与以下完
  • Ionic Android 构建停止工作

    更新 Ionic 和 Cordova CLI 后 我的 Ionic Cordova 应用程序突然停止在 Android 上构建 过去两天我在谷歌上搜索解决方案 但找不到任何有帮助的东西 我假设这与 Cordova 现在使用 Gradle 来
  • 根据字段的值使用不同的 Pydantic 模型

    我有 2 个 Pydantic 模型 var1 and var2 输入的PostExample方法可以接收第一个模型或第二个模型的数据 指某东西的用途Union有助于解决这个问题 但在验证过程中 它会引发第一个和第二个模型的错误 如何做到在