Romeo M.
Romeo M.

Reputation: 3278

SQLAlchemy: 'Model' object is not callable

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

Answers (1)

Mark Hildreth
Mark Hildreth

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

Related Questions