Attempt run-time change of type annotations on model fields

This commit is contained in:
Andrew Brookins 2021-10-21 13:12:54 -07:00
parent 15b7d360eb
commit 0f9f7aa868
2 changed files with 18 additions and 2 deletions

View file

@ -976,6 +976,13 @@ class ModelMeta(ModelMetaclass):
# in queries, like Model.get(Model.field_name == 1)
for field_name, field in new_class.__fields__.items():
setattr(new_class, field_name, ExpressionProxy(field, []))
annotation = new_class.get_annotations().get(field_name)
if annotation:
new_class.__annotations__[field_name] = Union[
annotation, ExpressionProxy
]
else:
new_class.__annotations__[field_name] = ExpressionProxy
# Check if this is our FieldInfo version with extended ORM metadata.
if isinstance(field.field_info, FieldInfo):
if field.field_info.primary_key:
@ -1139,6 +1146,17 @@ class RedisModel(BaseModel, abc.ABC, metaclass=ModelMeta):
docs.append(doc)
return docs
@classmethod
def get_annotations(cls):
d = {}
for c in cls.mro():
try:
d.update(**c.__annotations__)
except AttributeError:
# object, at least, has no __annotations__ attribute.
pass
return d
@classmethod
def add(cls, models: Sequence["RedisModel"]) -> Sequence["RedisModel"]:
# TODO: Add transaction support

View file

@ -6,7 +6,6 @@ from typing import List, Optional
from unittest import mock
import pytest
import redis
from pydantic import ValidationError
from redis_developer.model import EmbeddedJsonModel, Field, JsonModel
@ -528,7 +527,6 @@ def test_not_found(m):
m.Member.get(1000)
@pytest.mark.skip("Does not clean up after itself properly")
def test_list_field_limitations(m):
with pytest.raises(RedisModelError):