可以按模型中的属性进行订购吗?
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
in query
`for player in session.query(PlayerModel).order_by(PlayerModel.wins+PlayerModel.defeats):`
它可以工作,但当我输入时 id 不起作用
session.query(PlayerModel).order_by(PlayerModel.wins+PlayerModel.score):`
它报告错误期望 SQL 字符串。可以按 desc 中的属性排序吗?
(我可以加载所有内容并在应用程序级别进行排序,但如果有大量记录,那就不好了。其他肮脏的解决方案是归档分数并触发,但使用顺序和属性似乎更优雅,可能吗?)
是的,你需要使用一个名为混合属性。该表达式需要用 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)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)