Задача:

Появилась необходимость на бэке при получении строки типа "" превратить её в None


Есть просто запрет на пустые строки

# min_length для полей
class Model(BaseModel):
    title: str = Field(min_length=1)


# либо через конфиг для всех полей min_anystr_length
class SecondModel(BaseModel):
    title: str

    class Config:
        min_anystr_length = 1


Но это не решает приведение пустой строки к None

Для этой задачи можно использовать валидатор:

def optional_string_validator(value: str | None) -> str | None:
    """ Валидатор предназначен для реализации логики: получили пустую строку - считаем её None """
    if value is not None:
        value = value.strip()
        if value == '':
            value = None

    return value

Дополнительно можно реализовать свои типы(для обязательной строки и для опциональной), чтобы не указывать каждый раз валидаторы

# использование с помощью Annotated с указанием типа реализует корректные ошибки pydantic, 
# заменить два типа на один не получится
MyStr = Annotated[str, BeforeValidator(optional_string_validator)]
MyOptionalStr = Annotated[str | None, BeforeValidator(optional_string_validator)]

class Model(BaseModel):
    title: MyStr