Я использую флеш-фреймворк с 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 )
} )
Любая идея, почему эта ошибка?
order
- это объект заказа, и вы определили отношение "пользователь" как свойство. Следовательно, свойство "пользователь" будет представлять объект пользователя. Это может быть в отличие от других ORM, которые вы использовали, когда order.user
фактически является некоторой функцией, которую нужно вызвать для извлечения пользователя или, возможно, объекта запроса, который возвращает пользователя.
Сделайте следующее, если вы хотите увидеть это в действии...
user = order.user
print type(user)
Вы заметите, что order.user
возвращает экземпляр "Пользователь" (или в некоторых случаях может вернуть None
или создать исключение). В этом случае вызов order.user()
будет пытаться "вызвать" экземпляр User
.
Поэтому сообщение об ошибке имеет смысл, поскольку вы пытаетесь вызвать экземпляр User
, а User
не был определен как вызываемый объект.