pythonfastapipydantic-v2

Add Extra Field than Model in Pydantic which dependent in another field value


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.


Solution

  • 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