Multiple models

from typing import Union
from pydantic import BaseModel

class Organization(BaseModel):
    name: str
    address: str

class Person(BaseModel):
    name: str
    address: str
    year_of_birth: int



class Device(BaseModel):
    name: str
    manufactured_by: Union[Person, Organization]
my_device = Device(name="my_device", manufactured_by={"name": "John Doe", "address": "123 Main St.", "year_of_birth": 1980})
type(my_device.manufactured_by)
__main__.Person
my_device = Device(name="my_device", manufactured_by={"name": "John Doe", "address": "123 Main St."})
type(my_device.manufactured_by)
__main__.Organization
try:
    my_device.manufactured_by.year_of_birth = 1980
except ValueError as e:
    print(e)
"Organization" object has no field "year_of_birth"

my_device_dict = my_device.model_dump()
my_device_dict
{'name': 'my_device',
 'manufactured_by': {'name': 'John Doe', 'address': '123 Main St.'}}
import typedlogic.theories.jsonlog.loader as jsonlog_loader

facts = list(jsonlog_loader.generate_from_object(my_device_dict))
facts
[NodeIsObject(loc='/'),
 ObjectNodeLookup(loc='/', key='name', member='/name/'),
 NodeIsLiteral(loc='/name/'),
 NodeStringValue(loc='/name/', value='my_device'),
 ObjectNodeLookup(loc='/', key='manufactured_by', member='/manufactured_by/'),
 NodeIsObject(loc='/manufactured_by/'),
 ObjectNodeLookup(loc='/manufactured_by/', key='name', member='/manufactured_by/name/'),
 NodeIsLiteral(loc='/manufactured_by/name/'),
 NodeStringValue(loc='/manufactured_by/name/', value='John Doe'),
 ObjectNodeLookup(loc='/manufactured_by/', key='address', member='/manufactured_by/address/'),
 NodeIsLiteral(loc='/manufactured_by/address/'),
 NodeStringValue(loc='/manufactured_by/address/', value='123 Main St.')]