1

我正在使用带有 sqlalchemy 的 Flask 框架,我无法查询结果的一些相关表。

用户 > 有很多 > 订单

所以我有订单,我想查询该订单所属的用户。

order = Order.query.get( id )
return order.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 )
} )

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

4

1 回答 1

3

order是订单对象,并且您已将“用户”关系定义为属性。因此,属性“user”将代表用户对象。这可能与您使用的其他 ORM 不同,其中order.user实际上是一些需要调用以检索用户的函数,或者可能是返回用户的查询对象。

如果您想查看此操作,请执行以下操作...

user = order.user
print type(user)

您会注意到它order.user返回一个“用户”实例(或者在某些情况下可能返回None或引发异常)。在这种情况下,调用order.user()将尝试“调用”User实例。

因此,错误消息是有意义的,因为您正在尝试调用User实例,并且User尚未定义为可调用对象。

于 2011-06-22T01:24:54.013 回答