Skip to content

Commit de3262c

Browse files
committed
Added SubqueryLoader to load model from query alias
1 parent 365fd60 commit de3262c

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
@@ -145,6 +145,13 @@ def none_as_none(self, enabled=True):
145145
return self
146146

147147

148+
class SubqueryLoader(ModelLoader):
149+
def __init__(self, model, subquery, **extras):
150+
super().__init__(model, **extras)
151+
self.columns = [subquery.corresponding_column(column) for column
152+
in model]
153+
154+
148155
class AliasLoader(ModelLoader):
149156
def __init__(self, alias, *column_names, **extras):
150157
super().__init__(alias, *column_names, **extras)

tests/test_loader.py

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

146146

147+
async def test_adjanency_list_on_nested_load(user):
148+
subquery = db.select(User).alias()
149+
base_query = subquery.outerjoin(Team).select()
150+
151+
query = base_query.execution_options(loader=(User.load('id')))
152+
u = await query.gino.first()
153+
# Because here arrives team_id, not user_id, and replaces it
154+
assert u.id is None
155+
156+
from gino.loader import SubqueryLoader
157+
query = base_query.execution_options(loader=SubqueryLoader(User, subquery, team=Team))
158+
u = await query.gino.first()
159+
assert u.id == user.id
160+
assert u.realname == user.realname
161+
assert u.nickname == user.nickname
162+
163+
assert isinstance(u.team, Team)
164+
assert u.team.id == user.team.id
165+
assert u.team.name == user.team.name
166+
167+
147168
async def test_adjacency_list_query_builder(user):
148169
group = Team.alias()
149170
u = await User.load(team=Team.load(parent=group.on(

0 commit comments

Comments
 (0)