Atrybuty hybrydowe
to specjalne metody, które działają zarówno jako właściwość Pythona, jak i wyrażenie SQL. Tak długo, jak Twój difficulty
funkcja może być wyrażona w SQL, może być używana do filtrowania i porządkowania jak normalna kolumna.
Na przykład, jeśli obliczysz trudność jako liczbę papug, które ma problem, razy dziesięć, jeśli problem jest starszy niż 30 dni, użyjesz:
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
)
i wyślij zapytanie za pomocą:
session.query(Problem).order_by(Problem.difficulty.desc())