Skip to content

Commit 23e7bd1

Browse files
committed
handle default issue with multiple inheritance
1 parent dd3509a commit 23e7bd1

File tree

3 files changed

+81
-5
lines changed

3 files changed

+81
-5
lines changed

aredis_om/model/model.py

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1320,11 +1320,13 @@ def __new__(cls, name, bases, attrs, **kwargs): # noqa C901
13201320
meta = meta or getattr(new_class, "Meta", None)
13211321
base_meta = getattr(new_class, "_meta", None)
13221322

1323-
if len(bases) == 1:
1324-
for f_name in bases[0].model_fields:
1325-
field = bases[0].model_fields[f_name]
1326-
print(field)
1327-
new_class.model_fields[f_name] = field
1323+
if len(bases) >= 1:
1324+
for base_index in range(len(bases)):
1325+
model_fields = getattr(bases[base_index], "model_fields", [])
1326+
for f_name in model_fields:
1327+
field = model_fields[f_name]
1328+
print(field)
1329+
new_class.model_fields[f_name] = field
13281330

13291331
if meta and meta != DefaultMeta and meta != base_meta:
13301332
new_class.Meta = meta

tests/test_hash_model.py

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -976,3 +976,40 @@ class Child(Model):
976976

977977
assert rematerialized.age == 18
978978
assert rematerialized.bio is None
979+
980+
@py_test_mark_asyncio
981+
async def test_grandchild_class_expression_proxy():
982+
# https://github.com/redis/redis-om-python/issues/669 seeing weird issue with child classes initalizing all their undefined members as ExpressionProxies
983+
class Model(HashModel):
984+
first_name: str
985+
last_name: str
986+
age: int = Field(default=18)
987+
bio: Optional[str] = Field(default=None)
988+
989+
class Child(Model):
990+
other_name: str = "test"
991+
992+
class GrandChild(Child):
993+
grand_name: str = "test"
994+
995+
class GreatGrandChild(GrandChild):
996+
great_name: str = "test"
997+
998+
await Migrator().run()
999+
m = GreatGrandChild(first_name="Steve", last_name="Lorello")
1000+
assert m.age == 18
1001+
await m.save()
1002+
1003+
assert m.age == 18
1004+
assert m.other_name == "test"
1005+
assert m.grand_name == "test"
1006+
assert m.great_name == "test"
1007+
1008+
rematerialized = await GreatGrandChild.find(GreatGrandChild.pk == m.pk).first()
1009+
1010+
assert rematerialized.age == 18
1011+
assert rematerialized.age != 19
1012+
assert rematerialized.bio is None
1013+
assert rematerialized.other_name == "test"
1014+
assert rematerialized.grand_name == "test"
1015+
assert rematerialized.great_name == "test"

tests/test_json_model.py

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1195,6 +1195,43 @@ class Child(Model):
11951195
assert rematerialized.age != 19
11961196
assert rematerialized.bio is None
11971197

1198+
@py_test_mark_asyncio
1199+
async def test_grandchild_class_expression_proxy():
1200+
# https://github.com/redis/redis-om-python/issues/669 seeing weird issue with child classes initalizing all their undefined members as ExpressionProxies
1201+
class Model(JsonModel):
1202+
first_name: str
1203+
last_name: str
1204+
age: int = Field(default=18)
1205+
bio: Optional[str] = Field(default=None)
1206+
1207+
class Child(Model):
1208+
is_new: bool = True
1209+
1210+
class GrandChild(Child):
1211+
is_newer: bool = True
1212+
1213+
class GreatGrandChild(GrandChild):
1214+
is_great: bool = True
1215+
1216+
await Migrator().run()
1217+
m = GreatGrandChild(first_name="Steve", last_name="Lorello")
1218+
assert m.age == 18
1219+
await m.save()
1220+
1221+
assert m.age == 18
1222+
assert m.is_new is True
1223+
assert m.is_newer is True
1224+
assert m.is_great is True
1225+
1226+
rematerialized = await GreatGrandChild.find(GreatGrandChild.pk == m.pk).first()
1227+
1228+
assert rematerialized.age == 18
1229+
assert rematerialized.age != 19
1230+
assert rematerialized.bio is None
1231+
assert rematerialized.is_new is True
1232+
assert rematerialized.is_newer is True
1233+
assert rematerialized.is_great is True
1234+
11981235
@py_test_mark_asyncio
11991236
async def test_merged_model_error():
12001237
class Player(EmbeddedJsonModel):

0 commit comments

Comments
 (0)