Skip to content

Commit 3f2356b

Browse files
committed
Added SubqueryLoader to load model from query alias
1 parent 5ef344e commit 3f2356b

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
@@ -161,6 +161,27 @@ async def test_alias_loader_columns(user):
161161
assert u.id is not None
162162

163163

164+
async def test_adjanency_list_on_nested_load(user):
165+
subquery = db.select(User).alias()
166+
base_query = subquery.outerjoin(Team).select()
167+
168+
query = base_query.execution_options(loader=(User.load('id')))
169+
u = await query.gino.first()
170+
# Because here arrives team_id, not user_id, and replaces it
171+
assert u.id is None
172+
173+
from gino.loader import SubqueryLoader
174+
query = base_query.execution_options(loader=SubqueryLoader(User, subquery, team=Team))
175+
u = await query.gino.first()
176+
assert u.id == user.id
177+
assert u.realname == user.realname
178+
assert u.nickname == user.nickname
179+
180+
assert isinstance(u.team, Team)
181+
assert u.team.id == user.team.id
182+
assert u.team.name == user.team.name
183+
184+
164185
async def test_adjacency_list_query_builder(user):
165186
group = Team.alias()
166187
u = await User.load(team=Team.load(parent=group.on(

0 commit comments

Comments
 (0)