pythonfastapipydanticopenapi-generator

How to generate Long type variable in API spec generated by FastAPI?


This class is a part of a project:

from pydantic import BaseModel, StrictInt, constr, validator


class Person(BaseModel):
    person_id: StrictInt
    person_name: constr(strip_whitespace=True, strict=True)

    @validator('person_id')
    def person_id_validator(cls, val):
        assert val is not None
        return val

    @validator('person_name')
    def person_name_validator(cls, val):
        assert val != ''
        return val

When the API-spec is generated for this class using FastAPI().openapi(), the type of the variable person_id is always integer and consequently, the Java client generated from that spec always has the wrapper class Integer for the variable personId. However, personId can be a very long number (>5,000,000,000) which I can't keep in an Integer.

Pydantic itself doesn't have a Long built-in. Python handles int32 and int64 internally so I cannot control that either. I tried using numpy.int64 and torch.long with the help of arbitrary_types_allowed in class Config but that always fails at runtime with the message ValueError: Value not declarable with JSON Schema, field: name='person_id' type=int64 required=True.

How do I achieve this?


Solution

  • In OpenAPI, long integers are defined as:

    type: integer
    format: int64
    

    The key is to use the proper format. When using FastAPI/Pydantic, you can add the format attribute as follows:

    person_id: StrictInt = Field(..., format='int64')