假设我有许多模型都使用相同类型的列。例如
class PurchaseOrder(Model):
unitprice = Column(Numeric(10,2))
...other columns
class SalesOrder(Model):
salesprice = Column(Numeric(10,2))
...other columns
我想定义一些变量,如;
currencyamount = Column(Numeric(10,2))
然后,如果定义改变了,我只有一个地方可以修复它。我希望模型定义现在看起来像这样。
class PurchaseOrder(Model):
unitprice = currencyamount
...other columns
如果我尝试这样做,我会得到一个错误的行"列对象'单价'已经分配给表PurchaseOrder.">
我该怎么做呢?
我认为最干净的方法是创建一个抽象的Order
基类,其中包含您的通用属性定义,然后为您的不同订单类型创建子类。
SQLAlchemy允许您创建一个不会通过__abstract__
指示符在数据库中表示的基类。您可以在该类上定义通用属性。点击这里阅读更多内容
像这样的东西应该为你工作:
class Order(Model):
__abstract__ = True
unitprice = Column(Numeric(10,2))
class PurchaseOrder(Order):
...other columns
class SalesOrder(Order):
...other columns
unitprice
列将被两个子类继承。
你的对象在应用程序中是共享的。它是每个类使用的相同引用。也许你应该尝试使用一个工厂方法:
class PurchaseOrder(Model):
unitprice = get_currency_column()
...other columns
get_currency_column():
return Column(Numeric(10,2))
但是,坦率地说,我对列定义如此频繁地更改感到惊讶。
我通常使用一个函数,然后调用它来生成该列。这样做的另一个好处是,您可以添加参数来定制列配置。
def currencyamount_col():
return Column(Numeric(10,2))
#...
class PurchaseOrder(Model):
unitprice = currencyamount_col()
# ...other columns
下面是我使用的一个日期列工厂:
def dt_column(default_now=True, onupdate_now=False, **override_col_kwargs):
dt_kwargs = {
"timezone": True
}
dt = DateTime(**dt_kwargs)
col_kwargs = {}
if default_now:
col_kwargs['default'] = utc_now
if onupdate_now:
col_kwargs['onupdate'] = utc_now
col_kwargs.update(override_col_kwargs)
return Column(dt, **col_kwargs)