create_model support generics model (#3946)

* create_model support generics model

* fix change.

Co-authored-by: chenyijian <chenyijian@mycapital.net>
Co-authored-by: Samuel Colvin <samcolvin@gmail.com>
This commit is contained in:
chenyijian
2022-08-11 18:34:24 +08:00
committed by GitHub
parent 4fb872ef3a
commit 02a2a8b5c0
3 changed files with 25 additions and 3 deletions
+1
View File
@@ -0,0 +1 @@
Support generics model with `create_model`
+7 -3
View File
@@ -4,7 +4,7 @@ from copy import deepcopy
from enum import Enum
from functools import partial
from pathlib import Path
from types import FunctionType
from types import FunctionType, prepare_class, resolve_bases
from typing import (
TYPE_CHECKING,
AbstractSet,
@@ -996,8 +996,12 @@ def create_model(
namespace.update(fields)
if __config__:
namespace['Config'] = inherit_config(__config__, BaseConfig)
return type(__model_name, __base__, namespace, **__cls_kwargs__)
resolved_bases = resolve_bases(__base__)
meta, ns, kwds = prepare_class(__model_name, resolved_bases, kwds=__cls_kwargs__)
if resolved_bases is not __base__:
ns['__orig_bases__'] = __base__
namespace.update(ns)
return meta(__model_name, resolved_bases, namespace, **kwds)
_missing = object()
+17
View File
@@ -1,6 +1,9 @@
from typing import Generic, TypeVar
import pytest
from pydantic import BaseModel, Extra, Field, ValidationError, create_model, errors, validator
from pydantic.generics import GenericModel
def test_create_model():
@@ -205,3 +208,17 @@ def test_config_field_info_create_model():
m2 = create_model('M2', __config__=Config, a=(str, Field(...)))
assert m2.schema()['properties'] == {'a': {'title': 'A', 'description': 'descr', 'type': 'string'}}
def test_generics_model():
T = TypeVar('T')
class TestGenericModel(GenericModel):
pass
AAModel = create_model(
'AAModel', __base__=(TestGenericModel, Generic[T]), __cls_kwargs__={'orm_mode': True}, aa=(int, Field(0))
)
result = AAModel[int](aa=1)
assert result.aa == 1
assert result.__config__.orm_mode is True