I am very new to fastAPI and I am trying to replicate Django models.SerializerMethodField() in pydantic base model, As in Django we can do
class A(serailizer.Serializers):
service = serializer.SerializerMethodField()
def get_service(self, instance):
return "option1" if instance.some_field else "option2"
So, I am using pydantic v2 and I am doing this in following way
class ConnectorRead(TimeStampedBaseModel, ConnectorBase):
connector_id: int
service: ConnectorService = None
class Config:
# orm_mode = True # it has been changed in v2
from_attributes = True
@field_serializer("service")
def get_service(self, value) -> ConnectorService:
return ConnectorService.INTERNAL if self.function_name else ConnectorService.EXTERNAL
Is this approach correct or we have other way to do same? I looked up but I couldn't find enough resources to understand it.
My router code is as following
@router.get("/", response_model=List[ConnectorRead])
def list_connectors(skip: int = 0, limit: int = 10, db: Session = Depends(get_db)):
connectors = db.query(Connector).offset(skip).limit(limit).all()
return connectors
As you can see, I am using response_model directly to serialize my model objects.
Thanks in advance.
What you want is a computed field:
from pydantic import computed_field
class ConnectorRead(TimeStampedBaseModel, ConnectorBase):
connector_id: int
class Config:
from_attributes = True
@computed_field
@property
def service(self) -> ConnectorService:
return ConnectorService.INTERNAL if self.function_name else ConnectorService.EXTERNAL