Skip to content

Commit a8cfb1d

Browse files
committed
Added SubqueryLoader to load model from query alias
1 parent 7d7b9c4 commit a8cfb1d

File tree

2 files changed

+28
-0
lines changed

2 files changed

+28
-0
lines changed

gino/loader.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,13 @@ def none_as_none(self, enabled=True):
160160
return self
161161

162162

163+
class SubqueryLoader(ModelLoader):
164+
def __init__(self, model, subquery, **extras):
165+
super().__init__(model, **extras)
166+
self.columns = [subquery.corresponding_column(column) for column
167+
in model]
168+
169+
163170
class AliasLoader(ModelLoader):
164171
def __init__(self, alias, *columns, **extras):
165172
super().__init__(alias, *columns, **extras)

tests/test_loader.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,27 @@ def loader(row, context):
151151
assert u.team.parent.name == user.team.parent.name
152152

153153

154+
async def test_adjanency_list_on_nested_load(user):
155+
subquery = db.select(User).alias()
156+
base_query = subquery.outerjoin(Team).select()
157+
158+
query = base_query.execution_options(loader=(User.load('id')))
159+
u = await query.gino.first()
160+
# Because here arrives team_id, not user_id, and replaces it
161+
assert u.id is None
162+
163+
from gino.loader import SubqueryLoader
164+
query = base_query.execution_options(loader=SubqueryLoader(User, subquery, team=Team))
165+
u = await query.gino.first()
166+
assert u.id == user.id
167+
assert u.realname == user.realname
168+
assert u.nickname == user.nickname
169+
170+
assert isinstance(u.team, Team)
171+
assert u.team.id == user.team.id
172+
assert u.team.name == user.team.name
173+
174+
154175
async def test_adjacency_list_query_builder(user):
155176
group = Team.alias()
156177
u = await User.load(team=Team.load(parent=group.on(

0 commit comments

Comments
 (0)