2012-12-28 4 views
2

모델의 특성을 사용하여 작업 할 수 있습니까? 쿼리모델의 특성을 사용하여 작업 할 수 있습니까?

`for player in session.query(PlayerModel).order_by(PlayerModel.wins+PlayerModel.defeats):` 

작동하지만, ID가 나는 그것이 오류가 SQL 문자열을 기대보고

session.query(PlayerModel).order_by(PlayerModel.wins+PlayerModel.score):` 

을 넣을 때 작동하지 않습니다에

class PlayerModel(Base): 
    __tablename__ = 'players' 
    alliances_id = Column(Integer, ForeignKey('alliances.id'), nullable=True) 
    alliance = relationship('AllianceModel') 
    username = Column(String(30), nullable=False) 
    wins = Column(Integer, default=0, nullable=False) 
    defeats = Column(Integer, default=0, nullable=False) 

    @property 
    def score(self): 
     number = self.wins + self.defeats 
     if number: 
      return self.wins/number 
     return 0 

. 내림차순으로 속성별로 정렬 할 수 있습니까? (응용 프로그램 수준에서는 모두를로드하고 정렬 할 수 있지만 레코드가 많으면 좋지 않습니다. 다른 더러운 솔루션은 점수 필드를 생성하고 트리거하는 것이지만 더 정교하고 질서가있는 것 같습니다.)

답변

7

예, hybrid attributes이라는 기능을 사용해야합니다. 이 표현식은 Python 로직과 SQL 표현 로직의 관점에서 설명해야합니다.

from sqlalchemy.ext.hybrid import hybrid_property 
from sqlalchemy import case 

class PlayerModel(Base): 
    __tablename__ = 'players' 
    alliances_id = Column(Integer, ForeignKey('alliances.id'), nullable=True) 
    alliance = relationship('AllianceModel') 
    username = Column(String(30), nullable=False) 
    wins = Column(Integer, default=0, nullable=False) 
    defeats = Column(Integer, default=0, nullable=False) 

    @hybrid_property 
    def score(self): 
     number = self.wins + self.defeats 
     if number: 
      return self.wins/number 
     return 0 

    @score.expression 
    def score(cls): 
     number = cls.wins + cls.defeats 
     return case([(number > 0, cls.wins/number)], else_ = 0) 
관련 문제