Attributs hybrides
sont des méthodes spéciales qui agissent à la fois comme une propriété Python et une expression SQL. Tant que votre difficulty
La fonction peut être exprimée en SQL, elle peut être utilisée pour filtrer et trier comme une colonne normale.
Par exemple, si vous calculez la difficulté comme le nombre de perroquets qu'un problème a, multiplié par dix si le problème date de plus de 30 jours, vous utiliserez :
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
)
et interrogez-le avec :
session.query(Problem).order_by(Problem.difficulty.desc())