Hybridattribute
sind spezielle Methoden, die sowohl als Python-Eigenschaft als auch als SQL-Ausdruck fungieren. Solange Ihre difficulty
Funktion kann in SQL ausgedrückt werden, sie kann zum Filtern und Sortieren wie eine normale Spalte verwendet werden.
Wenn Sie beispielsweise die Schwierigkeit als Anzahl der Papageien eines Problems berechnen, multipliziert mit zehn, wenn das Problem älter als 30 Tage ist, würden Sie Folgendes verwenden:
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
)
und fragen Sie es ab mit:
session.query(Problem).order_by(Problem.difficulty.desc())