Hybride attributter
er specielle metoder, der både fungerer som en Python-egenskab og et SQL-udtryk. Så længe din difficulty
funktion kan udtrykkes i SQL, den kan bruges til at filtrere og sortere som en normal kolonne.
For eksempel, hvis du beregner sværhedsgrad som antallet af papegøjer et problem har, gange ti hvis problemet er ældre end 30 dage, vil du bruge:
from datetime import datetime, timedelta
from sqlalchemy import Column, Integer, DateTime, case
from sqlalchemy.ext.hybrid import hybrid_property
class Problem(Base):
parrots = Column(Integer, nullable=False, default=1)
created = Column(DateTime, nullable=False, default=datetime.utcnow)
@hybrid_property
def difficulty(self):
# this getter is used when accessing the property of an instance
if self.created <= (datetime.utcnow() - timedelta(30)):
return self.parrots * 10
return self.parrots
@difficulty.expression
def difficulty(cls):
# this expression is used when querying the model
return case(
[(cls.created <= (datetime.utcnow() - timedelta(30)), cls.parrots * 10)],
else_=cls.parrots
)
og forespørg det med:
session.query(Problem).order_by(Problem.difficulty.desc())