2013-03-23 55 views
1

我正在做一个网站,使用金字塔,SQLAlchemy的和变色龙... 在view.py我送的SQLAlchemy:SQL炼金术+金字塔 “请求缓存”

@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()” 运行两次,所以我说这个模型上:

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 

,并开始使用“NumFixedMinions”而不是“.count()”,但是这使得_NumFixedMintions被定义,直到我重新启动服务器,我错过了什么?或者是有什么办法只在请求做一个简单的“缓存” ..

PS:这不是真正的代码,它很难知道什么时候事端将两倍于网站上使用的模块化

回答

2

只需拨打count()一次在你的模板:

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

有关信息要在请求中使用也许,我会使用一个request property;如果设置reifyTrue那么它只会计算一次使用时:

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> 
+0

在这种情况下是...但我的网站是模块化的,用户可以在同一个页面内扮演多个小部件和页面,因此很难知道“count”会被调用多少次,有时可能是分配次数......或者没有一个 – Joaolvcm 2013-03-23 16:02:53

+0

,这更接近我所需要的,我想要更直接的东西,但如果不得不d像这样,它可能并不那么糟糕 – Joaolvcm 2013-03-23 17:24:36