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

Dataclasses: Require at least one value to be set in grouping of model fields

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

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

如何要求将这三个字段(field1field2field3)中的至少一个设置为非空字符串?是否有一些内置的方法来指定至少一个字段必须是 non-nil/empty(除了自定义根验证器)?

您可以使用根验证器或将验证器添加到 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())

您可以定义一个 __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")