1

sqlalchemyでFlaskフレームワークを使用していますが、結果の関連テーブルをクエリできません。

ユーザー>注文が多い>

注文があり、注文が属するユーザーにクエリを実行したいと思います。

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

なぜこのエラーが発生するのか考えてみてください。

4

1 に答える 1

3

orderは注文オブジェクトであり、「ユーザー」関係をプロパティとして定義しました。したがって、プロパティ「user」はユーザーオブジェクトを表します。order.userこれは、ユーザーを取得するために呼び出される必要のある関数や、ユーザーを返すクエリオブジェクトが実際に存在する、使用した他のORMとは異なる場合があります。

これが実際に動作するのを見たい場合は、次のようにしてください...

user = order.user
print type(user)

「User」インスタンスを返すことに気付くでしょうorder.user(または、場合によってはNone、例外を返すか発生させる可能性があります)。この場合、呼び出しorder.user()はインスタンスを「呼び出し」ようとしUserます。

Userしたがって、インスタンスを呼び出そうとしていて、呼び出し可能なUserオブジェクトとして定義されていないため、エラーメッセージは意味があります。

于 2011-06-22T01:24:54.013 に答える