SQLAlchemy: объект Model не вызывается - PullRequest
1 голос
/ 22 июня 2011

Я использую инфраструктуру Flask с sqlalchemy и не могу запросить некоторые связанные таблицы результатов.

Пользователи> имеют много> заказов

Итак, у меня есть заказ, и я хочу запросить пользователя, которому принадлежит заказ.

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

Есть идеи, почему эта ошибка?

1 Ответ

3 голосов
/ 22 июня 2011

order - это объект заказа, и вы определили отношение "пользователь" как свойство.Следовательно, свойство «пользователь» будет представлять объект пользователя.Это может отличаться от других ORM, которые вы использовали, где order.user - это на самом деле какая-то функция, которую нужно вызвать для извлечения пользователя, или, возможно, объект запроса, который возвращает пользователя.

Выполните следующее, если вы 'хотелось бы увидеть это в действии ...

user = order.user
print type(user)

Вы заметите, что order.user возвращает экземпляр "Пользователь" (или в некоторых случаях может возвращать None или вызывать исключение).В этом случае вызов order.user() попытается «вызвать» экземпляр User.

Поэтому сообщение об ошибке имеет смысл, поскольку вы пытаетесь вызвать экземпляр User, а Userне был определен как вызываемый объект.

...