可以使用模型中的属性进行订购吗?

2024-10-04 05:24:07 发布

您现在位置:Python中文网/ 问答频道 /正文

可以使用模型中的属性进行订购吗

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

质疑

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

它能用,但当我把

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

除SQL字符串外,它报告错误。是否可以在desc中按属性排序? (我可以在应用程序级别加载所有数据并进行排序,但如果有很多记录,这是不好的。其他肮脏的解决方案是将分数归档并触发,但使用顺序和属性似乎更优雅,这是可能的吗?)


Tags: selfidfalsedefaultnumberreturn属性column
1条回答
网友
1楼 · 发布于 2024-10-04 05:24:07

是的,您需要使用名为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)

相关问题 更多 >