Thuộc tính kết hợp
là các phương thức đặc biệt hoạt động như một thuộc tính Python và một biểu thức SQL. Miễn là difficulty
của bạn hàm có thể được thể hiện bằng SQL, nó có thể được sử dụng để lọc và sắp xếp như một cột bình thường.
Ví dụ:nếu bạn tính độ khó bằng số con vẹt mà một bài toán gặp phải, gấp 10 lần nếu bài toán cũ hơn 30 ngày, bạn sẽ sử dụng:
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
)
và truy vấn nó bằng:
session.query(Problem).order_by(Problem.difficulty.desc())