Skip to content

Commit 65aed13

Browse files
committed
fix model override behavior
1 parent 429c4d2 commit 65aed13

File tree

2 files changed

+22
-1
lines changed

2 files changed

+22
-1
lines changed

src/gino/declarative.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -289,8 +289,12 @@ def _init_table(cls, sub_cls):
289289
inspected_args = []
290290
updates = {}
291291
column_name_map = InvertDict()
292-
for each_cls in sub_cls.__mro__[::-1]:
292+
visited = set()
293+
for each_cls in sub_cls.__mro__:
293294
for k, v in getattr(each_cls, "__namespace__", each_cls.__dict__).items():
295+
if k in visited:
296+
continue
297+
visited.add(k)
294298
declared_callable_attr = callable(v) and getattr(
295299
v, "__declared_attr__", False
296300
)

tests/test_declarative.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -328,3 +328,20 @@ def table_name(cls):
328328
assert n_call == 1
329329
assert Model.table_name == "model6"
330330
assert n_call == 1
331+
332+
333+
async def test_override():
334+
class ModelMixin:
335+
field = db.Column(db.String)
336+
337+
class Model(db.Model, ModelMixin):
338+
__tablename__ = "model7"
339+
340+
normal = db.Column(db.Integer)
341+
342+
@property
343+
def field(self):
344+
return "field is a const value"
345+
346+
assert len(Model.__table__.columns) == 1
347+
assert Model().field == "field is a const value"

0 commit comments

Comments
 (0)