SQLAlchemy: объект Model не вызывается

1

Я использую флеш-фреймворк с 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 )
} )

Любая идея, почему эта ошибка?

Теги:
flask
sqlalchemy
flask-sqlalchemy

1 ответ

3
Лучший ответ

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

Сделайте следующее, если вы хотите увидеть это в действии...

user = order.user
print type(user)

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

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

  • 0
    Таким образом, вы, вероятно, хотите "user.username", а не "user ()"
  • 1
    Правильно, поэтому получение имени пользователя - это "order.user.username", а не "order.user (). Username"

Ещё вопросы

Сообщество Overcoder
Наверх
Меню