Skip to content

[BUG] Paginated Discriminated Annotated Unions response schemas are overridden in OpenAPI docs by make_response_paginated #1308

Open
@M3te0r

Description

@M3te0r

Describe the bug
Hi,

In my company project we use extensively Annotated Discriminated Unions both for inputs and outputs schemas
We recentlty encountered wrongly assigned schemas in openapi doc, as we added a paginated endpoint

Here is a minimal reproductible api code:

from typing import Annotated
from typing import Literal
from typing import Union

from ninja import Field
from ninja import NinjaAPI
from ninja import Router
from ninja import Schema
from ninja.pagination import paginate


api = NinjaAPI(
    title="Nova API",
    version="1.0.0",
)


router_foo = Router(auth=None, tags=["RouterFoo"])
router_bar = Router(auth=None, tags=["RouterBar"])


class Foo1Schema(Schema):

    id: int
    disc: Literal["foo1"]


class Foo2Schema(Schema):
    id: int
    disc: Literal["foo2"]


class Bar1Schema(Schema):
    id: int
    disc: Literal["bar1"]


class Bar2Schema(Schema):
    id: int
    disc: Literal["bar2"]


DiscriminatedFooUnion = Annotated[
    Union[Foo1Schema, Foo2Schema],
    Field(discriminator="disc"),
]
DiscriminatedBarUnion = Annotated[
    Union[Bar1Schema, Bar2Schema],
    Field(discriminator="disc"),
]


@router_foo.get("/", response={200: list[DiscriminatedFooUnion]})
@paginate
def foos_endpoint(request):
    return []


@router_bar.get("/", response={200: list[DiscriminatedBarUnion]})
@paginate
def bars_endpoint(request):
    return []


api.add_router("/router_foo", router_foo)
api.add_router("/router_bar", router_bar)

This code will result in wrongly assigned Paged schemas in openapi doc

image

I believe this is caused by make_response_paginated and more precisely by the type creation being made with new_name = f"Paged{item_schema.__name__}" resulting in new_name = PagedAnnotated which is always the same name for Annotated schemas
As it's the same name, it probably overwrites previous schemas of same name in schemas registry

image

Versions (please complete the following information):

  • Python version: 3.12.4
  • Django version: 5.0.9
  • Django-Ninja version: 1.3.0
  • Pydantic version: 2.9.2

This is kind of problematic for us as our frontend team generates TS client types validation from the OpenAPI schemas

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions