1

ピラミッド、sqlalchemy、chameleon を使用して Web サイトを作成しています... view.py で sqlalchemy を送信します。

@view_config(route_name='entity_subpage')
def entity_subpage_view(request):
    dbsession = DBSession()
    User = dbsession.query(Users).filter_by(id=0).first()
    return render_to_response('page.pt', User=User, request=request)

とカメレオン:

<a tal:condition="user.minions.filter_by(dead=0).count() > 1">Prev</a>
<a tal:condition="user.minions.filter_by(dead=0).count() > 1">Next</a>
<repeat tal:omit-tag="" tal:repeat="_page user.minions">
    <condition tal:omit-tag="" tal:condition="not minion.dead"> 
        <li>
             ${minion.name}
        </li>
    </condition>
</repeat>

しかし、sqlalchemy "user.minions.count()" は 2 回実行されるため、モデルにこれを追加しました。

class Users(Base):
    __tablename__ = 'users'
    id = Column(Integer, primary_key=True)
    name = Column(String(convert_unicode=True))
    minions = dynamic_loader("Minions", backref="User")
    _NumFixedMinions = None

    @property
    def NumAliveMinions(self):
        if not self._NumFixedMinions:
            self._NumFixedMinions = self.minions.filter_by(dead=0).count()
        return self._NumFixedMinions

「.count()」の代わりに「NumFixedMinions」の使用を開始しましたが、これにより、サーバーを再起動するまで_NumFixedMintionsが定義されました。何か不足していますか? または、リクエスト中にのみ単純な「キャッシュ」を作成する方法はありますか..

追伸:これは実際のコードではありません。ウェブサイトがモジュール化されているため、いつ何かが 2 回使用されるかを知るのは困難です。

4

1 に答える 1

2

テンプレートでcount() 1 回呼び出すだけです。

<tal:links tal:condition="user.minions.filter_by(dead=0).count() > 1">
    <a>Prev</a>
    <a>Next</a>
</tal>

おそらくリクエストで使用したい情報については、 request プロパティを使用します。に設定reifyすると、一度だけTrue計算され、使用された場合にのみ計算されます。

def entity_subpage_view(request):
    dbsession = DBSession()
    User = dbsession.query(Users).filter_by(id=0).first()

    def dead_minion_count(request):
        return User.minions.filter_by(dead=0).count()

    request.set_property(dead_minion_count, 'dead_minion_count', reify=True)

    return render_to_response('page.pt', User=User, request=request)

それから

<tal:links tal:condition="request.dead_minion_count > 1">
    <a>Prev</a>
    <a>Next</a>
</tal>
于 2013-03-23T15:58:28.957 に答える