Skip to content

Commit 0b415c6

Browse files
committed
Enhance ModelSchemaMetaclass to accept additional kwargs in __new__ method and add test for schema with generic mixin class
1 parent 99edde1 commit 0b415c6

File tree

2 files changed

+53
-4
lines changed

2 files changed

+53
-4
lines changed

ninja_schema/orm/model_schema.py

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -320,11 +320,12 @@ def __new__(
320320
name: str,
321321
bases: tuple,
322322
namespace: dict,
323+
**kwargs: Any,
323324
):
324325
if bases == (SchemaBaseModel,) or not namespace.get(
325326
"Config", namespace.get("model_config")
326327
):
327-
return super().__new__(mcs, name, bases, namespace)
328+
return super().__new__(mcs, name, bases, namespace, **kwargs)
328329

329330
config = namespace.get("Config")
330331
if not config:
@@ -407,16 +408,20 @@ def __new__(
407408

408409
field_values[field_name] = (python_type, pydantic_field)
409410
if IS_PYDANTIC_V1:
410-
cls = super().__new__(mcs, name, bases, namespace)
411+
cls = super().__new__(mcs, name, bases, namespace, **kwargs)
411412
return update_class_missing_fields(
412413
cls,
413414
list(bases),
414415
compute_field_annotations(namespace, **field_values),
415416
)
416417
return super().__new__(
417-
mcs, name, bases, compute_field_annotations(namespace, **field_values)
418+
mcs,
419+
name,
420+
bases,
421+
compute_field_annotations(namespace, **field_values),
422+
**kwargs,
418423
)
419-
return super().__new__(mcs, name, bases, namespace)
424+
return super().__new__(mcs, name, bases, namespace, **kwargs)
420425

421426

422427
class SchemaBaseModel(SchemaMixins, BaseModel):

tests/test_v2_pydantic/test_model_schema.py

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -514,3 +514,47 @@ def validate_title(cls, value):
514514

515515
event = EventWithNewModelConfig(start_date="2021-06-12", title="PyConf 2021")
516516
assert "value cleaned" in event.title
517+
518+
@pytest.mark.django_db
519+
@pytest.mark.skipif(IS_PYDANTIC_V1, reason="requires pydantic == 2.1.x")
520+
def test_schema_with_mixin_generic_class(self):
521+
"""
522+
Test that a schema with a generic mixin class works correctly.
523+
"""
524+
525+
import datetime
526+
import typing as t
527+
528+
from django.db.models import Model as DjangoModel
529+
530+
T = t.TypeVar("T", bound=DjangoModel)
531+
532+
class GenericMixin(t.Generic[T]):
533+
def save(self, instance: T | None = None) -> T:
534+
"""
535+
Save the model instance and return it.
536+
"""
537+
if instance:
538+
self.apply_to_model(instance, **self.dict())
539+
instance.save()
540+
return instance
541+
542+
instance = self.Config.model(**self.dict())
543+
instance.save()
544+
return instance
545+
class BaseModelSchema(ModelSchema, GenericMixin[T]):
546+
...
547+
class EventGenericSchema(BaseModelSchema[Event]):
548+
class Config:
549+
model = Event
550+
include = (
551+
"title",
552+
)
553+
554+
event = EventGenericSchema(title="PyConf 2021")
555+
assert event.title == "PyConf 2021"
556+
557+
instance_event = event.save()
558+
assert isinstance(instance_event, Event)
559+
assert instance_event.title == "PyConf 2021"
560+

0 commit comments

Comments
 (0)