SQLAlchemy:‘Model’对象不可调用

1 投票
1 回答
13970 浏览
提问于 2025-04-16 20:03

我正在使用Flask框架和sqlalchemy,但我无法查询某个结果的相关表。

用户和订单之间的关系是:一个用户可以有多个订单。

所以我手上有一个订单,想要查询这个订单属于哪个用户。

order = Order.query.get( id )
return order.user()

当我这样调用时,出现了“'User'对象不可调用”的错误。我的关系是这样定义的:

#   ----------------------------------------------------------------------------------
#   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 )
} )

有人知道为什么会出现这个错误吗?

1 个回答

3

order 是一个订单对象,而你把 "user" 这个关系定义成了一个属性。所以,属性 "user" 就代表了用户对象。这可能和你之前用过的其他ORM(对象关系映射)不太一样,在那些ORM中,order.user 实际上是一个需要调用的函数,或者是一个返回用户的查询对象。

如果你想看看这个是怎么工作的,可以做以下操作...

user = order.user
print type(user)

你会发现 order.user 返回的是一个 "User" 实例(在某些情况下可能返回 None 或者抛出一个异常)。在这种情况下,调用 order.user() 会试图去 "调用" 这个 User 实例。

所以,错误信息是有道理的,因为你试图调用一个 User 实例,而 User 并没有被定义为一个可以被调用的对象。

撰写回答