def decorate_query(
self, query, owner_alias, coll_alias, parent_instance, ctx):
# This will decorate a query with a join on the relation.
inv = self.back_relation
if inv:
query = query.join(owner_alias,
getattr(coll_alias, inv.key))
else:
# hope for the best
try:
query = query.join(owner_alias)
except InvalidRequestError:
log.error("Could not join %s to %s" % (owner_alias, query))
# This is very likely to fail downstream
return query
found_key = False
if inv and not uses_list(inv):
# Try to constrain on coll_alias's key vs owner_alias.
# Difficult cases happen when tombstone is part of the
# reln's columns
for column in inv.local_columns:
for fk in column.foreign_keys:
if fk.column.table == parent_instance.__class__.__table__:
query = query.filter(
getattr(coll_alias, column.name) ==
parent_instance.id)
found_key = True
if not found_key:
query = query.filter(owner_alias.id == parent_instance.id)
return query
评论列表
文章目录