1 回答

TA貢獻1877條經驗 獲得超6個贊
該混合提供了一個既可以在 Python 級別也可以在 SQL 表達式級別工作的表達式
讓我們看一個例子:
class User(Base):
__tablename__ = 'user'
id = Column(Integer, primary_key=True)
firstname = Column(String(50))
lastname = Column(String(50))
@hybrid_property
def fullname(self):
return self.firstname + ' ' + self.lastname
@property
def long_name(self):
return self.firstname + ' ' + self.lastname
session.add(User(firstname='Brendan', lastname='Simon'))
session.commit()
# error
# print(session.query(User).filter(User.long_name == 'Brendan Simon').first().id)
# works fine because @hybrid_property
print(session.query(User).filter(User.fullname == 'Brendan Simon').first().id)
您還可以SQL expression使用@fullname.expression進行自定義。
我什么時候應該使用或不應該使用 SQLA 裝飾器?
我想當你需要的時候你就會知道。例如,您可以將其用于快速別名:
class MetaData(Base):
__tablename__ = 'meta_data'
system_field = Column(String(20)) # a lot of calculations and processing in different places
# a lot of fields ...
有一天,幾個部分system_field被(或將)重命名為new_field(不重要為什么,誰和何時 - 只是事實)。您可以執行以下操作作為快速解決方案:
@hybrid_property
def new_field(self):
return self.system_field
@new_field.setter
def new_field(self, value: str):
self.system_field = value
# data from somewhere...
# data = {'new_field': 'default', other fields...}
# will works fine + in other places will work as `system_field` with old sql queries
process_meta(MetaData(**{data}))
所以這確實是一個很好的功能,但是如果你正在考慮是否需要它,那么你肯定不需要它。
添加回答
舉報