Любой из двух атрибутов Pydantic должен быть необязательным

#python #pydantic

#python #pydantic

Вопрос:

Я хочу проверить схему полезной нагрузки, и для этого я использую Pydantic. Класс, созданный путем наследования Pydantic BaseModel , называется as PayloadValidator и имеет два атрибута: addCustomPages список словарей и deleteCustomPages список строк.

 class NestedCustomPages(BaseModel):
    """This is the schema for each custom page."""

    html: str
    label: str
    type: int

class PayloadValidator(BaseModelWithContext):
    """This class defines the payload load schema and also validates it."""

    addCustomPages: Optional[List[NestedCustomPages]]
    deleteCustomPages: Optional[List[str]]
 

Я хочу объявить любой из атрибутов class PayloadValidator как необязательный. Я пытался найти решение для этого, но ничего не смог найти.

Ответ №1:

Некоторое время назад на странице pydantic Github возник вопрос по этому поводу: https://github.com/samuelcolvin/pydantic/issues/506 . В заключение приводится игрушечный пример с моделью, которая требует заполнения a или b с помощью средства проверки:

 from typing import Optional
from pydantic import validator
from pydantic.main import BaseModel


class MyModel(BaseModel):
    a: Optional[str] = None
    b: Optional[str] = None

    @validator('b', always=True)
    def check_a_or_b(cls, b, values):
        if not values.get('a') and not b:
            raise ValueError('Either a or b is required')
        return b


mm = MyModel()
 

Комментарии:

1. Для читателей порядок определения a и b имеет смысл. В этом примере при check_a_or_b запуске values может содержать a только потому b , что определяется впоследствии.