Yes, 'number' is a column, as you surmised. When I drop that from the path it works fine. The only remaining problem is/was that this ends up loading in every field in the child_product table, and this includes a potentially massive BSON column (and more).
After looking into this, I've now learned about deferred, defer, undefer, loadonly, etc. This seems to be the correct way to manage this, and it appears to be working fine:
q = q.options(sa.orm
.joinedload("defined_items")
.joinedload("child_product")
.load_only("number")
)
Thanks for pointing me in the right direction! This page had the info I needed:
Russ