ninja-schema icon indicating copy to clipboard operation
ninja-schema copied to clipboard

Regression when serializing `Field(alias=...)`

Open dzonecat opened this issue 6 months ago • 3 comments

Serializing a schema that uses Field(alias=...) worked up to 0.13.6 but fails beginning with 0.14.0.

Reproducer:

models.py

from django.db import models


class Question(models.Model):
    question_text = models.CharField(max_length=200)


class Choice(models.Model):
    question = models.ForeignKey(Question, on_delete=models.CASCADE)
    choice_text = models.CharField(max_length=200)

schemas.py

from ninja import Field, ModelSchema
from ninja_schema import Schema

from .models import Choice


class ChoiceSchema(ModelSchema):
    question_text: str = Field(alias="question.question_text")

    class Meta:
        model = Choice
        fields = ["choice_text"]


class ParentSchema(Schema):
    choice: ChoiceSchema

Note that I import ModelSchema from the "wrong" module. Importing it from ninja_schema makes it fail even with 0.13.6.

api.py

from ninja_extra import NinjaExtraAPI, api_controller, http_get

from .models import Choice
from .schemas import ParentSchema

api = NinjaExtraAPI()


@api_controller("/test", tags=["test"])
class TestController:
    @http_get("/test")
    def test(self) -> ParentSchema:
        return ParentSchema(choice=Choice.objects.get())


api.register_controllers(TestController)

Create one Question object and one Choice that references it.

Response up to 0.13.6

{
  "choice": {
    "question_text": "Question",
    "choice_text": "Choice"
  }
}

Response after 0.14.0

Traceback (most recent call last):
  File "/home/test/.pyenv/versions/3.13.4/lib/python3.13/site-packages/ninja_extra/operation.py", line 216, in run
    _processed_results = self._result_to_response(
        request, result, ctx.response
    )
  File "/home/test/.pyenv/versions/3.13.4/lib/python3.13/site-packages/ninja/operation.py", line 280, in _result_to_response
    validated_object = response_model.model_validate(
        resp_object, context={"request": request, "response_status": status}
    )
  File "/home/test/.pyenv/versions/3.13.4/lib/python3.13/site-packages/pydantic/main.py", line 705, in model_validate
    return cls.__pydantic_validator__.validate_python(
           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
        obj, strict=strict, from_attributes=from_attributes, context=context, by_alias=by_alias, by_name=by_name
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    )
    ^
pydantic_core._pydantic_core.ValidationError: 1 validation error for NinjaResponseSchema
response.choice.`question.question_text`
  Field required [type=missing, input_value=<DjangoGetter: ChoiceSche..., choice_text='Choice')>, input_type=DjangoGetter]
    For further information visit https://errors.pydantic.dev/2.11/v/missing

By the way, thanks for working on ninja-extra/schema!

dzonecat avatar Jul 10 '25 13:07 dzonecat

@dzonecat can you add your pydantic and Pydantic-core versions?

eadwinCode avatar Aug 07 '25 16:08 eadwinCode

@eadwinCode Of course 🙂

pydantic==2.11.7 pydantic-core==2.33.2

dzonecat avatar Aug 19 '25 11:08 dzonecat

I will look at this now to see what's going on

eadwinCode avatar Aug 21 '25 07:08 eadwinCode