I’m using Flask framework with sqlalchemy and I can’t query some related table of a result.
Users > have many > orders
So I have the order and I want to query the user that order belongs to.
order = Order.query.get( id )
return order.user()
When I call this I get that the ‘User’ object is not callable. Here’s how my relation is defined:
# ----------------------------------------------------------------------------------
# MODELS
# ----------------------------------------------------------------------------------
class User( object ):
__tablename__ = 'user'
query = db_session.query_property()
class Order( object ):
__tablename__ = 'order'
query = db_session.query_property()
# ----------------------------------------------------------------------------------
# MODELS SCHEMA
# ----------------------------------------------------------------------------------
users_table = Table( 'user', metadata,
Column( 'id', Integer, primary_key = True ),
Column( 'username', String( 50 ), unique = True ),
Column( 'email', String( 50 ), unique = True ),
Column( 'password', String( 32 ), nullable = False ),
...
mysql_engine = 'InnoDB',
mysql_charset = 'utf8'
)
orders_table = Table( 'order', metadata,
Column( 'id', Integer, primary_key = True ),
Column( 'user_id', Integer, ForeignKey( 'user.id' ) ),
Column( 'transaction_id', String( 32 ), unique = True ),
...
mysql_engine = 'InnoDB',
mysql_charset = 'utf8'
)
# ----------------------------------------------------------------------------------
# MAPPERS
# ----------------------------------------------------------------------------------
mapper( User, users_table, properties = {
# has many
'orders' : relationship( Order )
} )
mapper( Order, orders_table, properties = {
# belongs to
'user': relationship( User )
} )
Any idea why this error?
orderis the order object, and you’ve defined the “user” relationship as a property. Therefore, the property “user” will represent the user object. This may be unlike other ORMs you’ve used whereorder.useris actually some function that needs to get called to retrieve the user, or perhaps a query object that returns the user.Do the following if you’d like to see this in action…
You’ll notice that
order.userreturns a “User” instance (or in some cases may returnNoneor raise an exception). In this case, callingorder.user()will try to “call” theUserinstance.The error message therefore makes sense, since you’re trying to call a
Userinstance, andUserhasn’t been defined as a callable object.