4

Itemクラスと1対多の関係にあるUserクラスがあります。

class User(Base):
    items=relationship(Item)
    def method(self):
        for item in self.items
            if self.items.itemname=='my item'
                #do something

ここで、Userクラス内のメソッドでUserのいくつかのアイテム(フィルター処理されたもの)にアクセスしたいと思います。(例のように)すべての項目を実行するforループを作成する方が効率的ですか(パフォーマンスの面で)、クラス内でクエリを実行する方が効率的ですか?(平均的なユーザーには数千のアイテムがあるとしましょう)。また、クラス内でクエリを実行する方法もわかりません。self.query.filter()クラス内でセッションを定義して実行する方法のようなものはありますsession.query(Items).filter()か?

4

1 に答える 1

8

現在のインスタンスがセッションに接続されていることが確実な場合は、sqlalchemy.orm.session.object_session

したがって、次のようになります。

from sqlalchemy.orm.session import object_session

class User(Base):
    ...

    def method(self):
        session = object_session(self)
        session.query(Items).filter(...)

編集

別の方法として、動的リレーションシップローダーを提案できます。この場合、関係をクエリとして取得し、さらに定義することができます。

class User(Base):
    items=relationship(Item, lazy='dynamic')

user1 = session.query(User).get(user_id)
user1.items.filter(...)
于 2013-01-15T14:49:54.013 に答える