Search code examples
pythonfastapipython-typingpydantic

Python Pydantic double base model


I'm using FastAPI with Pydantic and I'm trying to achieve that my API accepts cammel case parameters, for this, I'm using the following

from pydantic import BaseModel
from humps import camelize


class CamelModel(BaseModel):
    class Config:
        alias_generator = camelize
        allow_population_by_field_name = True


class MyClass(CamelModel):
    my_field1: int
    my_field2: int
    my_field3: int

So far it works great, but MyClass is a base class for others classes, for example as

class MyNewClass(MyClass):
    my_field4: float

How can I get the MyNewClass to also use the camel case base class? I've tried something like

from typing import Union 
class MyNewClass(Union[MyClass, CamelModel]):
    my_field4: float

But I'm getting this error

TypeError: Cannot subclass <class 'typing._SpecialForm'>

Is there any way to accomplish this? Thanks!


Solution

  • What you are trying to achieve is called multiple inheritance. Since you are inheriting from a class which inherited from the CamelModel, there's no need to inherit it again

    The appropriate code should be

    class MyNewClass(MyClass):

    It's the python syntax for multiple inheritance. See an extensive example here https://www.python-course.eu/python3_multiple_inheritance_example.php#An-Example-of-Multiple-Inheritance

    The code you are using (class MyNewClass(Union[MyClass, CamelModel]):) is used for declaring data types, which is kinda of correct, but not in the right place. Typing is almost only (as far as I've seen) used for parameters of functions.

    NOTE I did not test the piece of code above, but I'm pretty sure it works. Let me know if there are any problems