数据类:需要在模型字段分组中至少设置一个值

Joe*_*ane 8 python python-3.7 python-dataclasses python-typing pydantic

如何要求数据类上的一组字段中的至少一个字段设置为真值?这是否需要自定义根验证器方法,因为它需要一次查看许多字段?例如,考虑以下数据类:

@dataclass
class MyModel:
    field1: Optional[str]: None
    field2: Optional[str]: None
    field3: Optional[str]: None
Run Code Online (Sandbox Code Playgroud)

如何要求这三个字段(field1field2field3)中的至少一个设置为非空字符串?是否有某种内置方法可以指定至少一个字段必须为非零/空(除了自定义根验证器之外)?

SCo*_*vin 11

您可以使用根验证器,也可以添加验证器并field3检查前面的字段(field1field2)以检查其中之一是否已设置。

root_validator

from typing import Optional

from pydantic import root_validator
from pydantic.dataclasses import dataclass


@dataclass
class MyModel:
    field1: Optional[str] = None
    field2: Optional[str] = None
    field3: Optional[str] = None

    @root_validator
    def any_of(cls, v):
        if not any(v.values()):
            raise ValueError('one of field1, field2 or field3 must have a value')
        return v


print(MyModel(field1='hello'))
print(MyModel(field2='goodbye'))
print(MyModel())
Run Code Online (Sandbox Code Playgroud)


Pat*_*ugh 9

您可以定义一个__post_init__在所有字段均为以下情况时引发错误的方法None

@dataclass
class MyModel:
    field1: Optional[str] = None
    field2: Optional[str] = None
    field3: Optional[str] = None

    def __post_init__(self):
        if self.field1 is None and self.field2 is None and self.field3 is None:
            raise TypeError("Value needed for at least one field")
Run Code Online (Sandbox Code Playgroud)