Skip to content

[BUG] Using pydantic.Json[SomeModel] in a query param fails #1153

Open
@way-dave

Description

@way-dave

Describe the bug

I'd like to be able to decode JSON-encoded pydantic models from a query param like this:

from __future__ import annotations

from django.http import HttpRequest
from ninja import NinjaAPI, Query, Schema
from pydantic import Json

api = NinjaAPI()

class PetSchema(Schema):
    nicknames: list[str]

class PersonSchema(Schema):
    pet: PetSchema | None

class QuerySchema(Schema):
    q: Json[PersonSchema]

@api.get("/")
def my_endpoint(request: HttpRequest, query: Query[QuerySchema]) -> None:
    pass

Unfortunately, it crashes out with this error:

File "/workspaces/app/staff_v2/foo.py", line 22, in <module>
  @api.get("/")
  ^^^^^^^^^^^^
File "/workspaces/app/.venv/lib/python3.11/site-packages/ninja/router.py", line 240, in decorator
  self.add_api_operation(
File "/workspaces/app/.venv/lib/python3.11/site-packages/ninja/router.py", line 289, in add_api_operation
  path_view.add_operation(
File "/workspaces/app/.venv/lib/python3.11/site-packages/ninja/operation.py", line 357, in add_operation
  operation = OperationClass(
              ^^^^^^^^^^^^^^^
File "/workspaces/app/.venv/lib/python3.11/site-packages/ninja/operation.py", line 69, in __init__
  self.signature = ViewSignature(self.path, self.view_func)
                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/workspaces/app/.venv/lib/python3.11/site-packages/ninja/signature/details.py", line 87, in __init__
  self.models: TModels = self._create_models()
                          ^^^^^^^^^^^^^^^^^^^^^
File "/workspaces/app/.venv/lib/python3.11/site-packages/ninja/signature/details.py", line 144, in _create_models
  flatten_map = self._args_flatten_map(args)
                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/workspaces/app/.venv/lib/python3.11/site-packages/ninja/signature/details.py", line 181, in _args_flatten_map
  for name, path in self._model_flatten_map(arg.annotation, arg.alias):
File "/workspaces/app/.venv/lib/python3.11/site-packages/ninja/signature/details.py", line 205, in _model_flatten_map
  yield from self._model_flatten_map(field.annotation, name)  # type: ignore
  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/workspaces/app/.venv/lib/python3.11/site-packages/ninja/signature/details.py", line 205, in _model_flatten_map
  yield from self._model_flatten_map(field.annotation, name)  # type: ignore
  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/workspaces/app/.venv/lib/python3.11/site-packages/ninja/signature/details.py", line 201, in _model_flatten_map
  for attr, field in model.model_fields.items():
                      ^^^^^^^^^^^^^^^^^^
AttributeError: 'types.UnionType' object has no attribute 'model_fields'

This makes me think it's not aware of the Json[...] annotation and is still trying to unfurl the model into individual query params.

Versions:

  • Python version: 3.11.6
  • Django version: 4.2.10
  • Django-Ninja version: 1.1.0
  • Pydantic version: 2.7.1

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