Reputation: 3278
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?
Upvotes: 1
Views: 14268
Reputation: 43111
order
is 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 where order.user
is 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...
user = order.user
print type(user)
You'll notice that order.user
returns a "User" instance (or in some cases may return None
or raise an exception). In this case, calling order.user()
will try to "call" the User
instance.
The error message therefore makes sense, since you're trying to call a User
instance, and User
hasn't been defined as a callable object.
Upvotes: 3