Estoy tratando de validar/analizar algunos datos con pydantic .
Quiero especificar que el dict puede tener una clave daytime o no. Si es así, quiero que el valor del daytime incluya tanto el sunrise como el sunset .
Por ejemplo, estos deben estar permitidos:
{ 'type': 'solar', 'daytime': { 'sunrise': 4, # 4am 'sunset': 18 # 6pm } }Y
{ 'type': 'wind' # daytime key is omitted }Y
{ 'type': 'wind', 'daytime': None }Pero quiero fallar la validación para
{ 'type': 'solar', 'daytime': { 'sunrise': 4 } } Porque esto tiene un valor de daytime , pero no de puesta de sol.
Tengo un código que hace esto. Si ejecuto este script, se ejecuta con éxito.
from pydantic import BaseModel, ValidationError from typing import List, Optional, Dict class DayTime(BaseModel): sunrise: int sunset: int class Plant(BaseModel): daytime: Optional[DayTime] = None type: str p = Plant.parse_obj({'type': 'wind'}) p = Plant.parse_obj({'type': 'wind', 'daytime': None}) p = Plant.parse_obj({ 'type': 'solar', 'daytime': { 'sunrise': 5, 'sunset': 18 }}) try: p = Plant.parse_obj({ 'type': 'solar', 'daytime': { 'sunrise': 5 }}) except ValidationError: pass else: raise AssertionError("Should have failed")Lo que me pregunto es, ¿es así como se supone que debes usar pydantic para datos anidados?
Tengo muchas capas de anidamiento, y esto parece un poco detallado.
¿Hay alguna manera de hacer algo más conciso, como:
class Plant(BaseModel): daytime: Optional[Dict[('sunrise', 'sunset'), int]] = None type: strLa función Pydanticcreate_model es exactamente lo que necesita:
from pydantic import BaseModel, create_model class Plant(BaseModel): daytime: Optional[create_model('DayTime', sunrise=(int, ...), sunset=(int, ...))] = None type: str