我在互联网上阅读使用关联代理的示例,但我发现所有这些代码都是用声明式样式编写的。
我可以在经典映射中使用它们吗?原因是我将数据库持久性实现到已经存在的类层次结构中,并且我希望将与数据库相关的代码保存在单独的文件中。
举个例子,我们假设一个模型,我们有一个Item
和一个Order
个对象。我们与关联表中的额外字段建立多对多关系,例如,为该项目支付的价格:
item = Table('item', metadata,
Column('id', Integer, primary_key=True),
Column('name', String),
Column('quantity', Integer)
)
order = Order('order', metadata,
Column('id', Integer, primary_key=True),
Column('customer_id', Integer, ForeignKey('user.id'))
)
order_item = Table('order_item', metadata,
Column('order_id', Integer, ForeignKey('order.id')),
Column('item_id', Integer, ForeignKey('item.id')),
Column('price', Float)
)
# Mapping of Tables to non-orm objects
我们假设我想以一种很好的方式访问用户关键字示例中解释in the docs的订单项。以声明方式将属性添加到作为关联代理的类中:
# ... Class definition ...
items = association_proxy('order_items', 'items')
如何以经典的地图样式进行此操作?
答案 0 :(得分:2)
AssociationProxy
生成的association_proxy()
对象 function是Python descriptor的一个实例。它总是被宣布 无论是否映射用户定义的类 使用mapper()
函数的声明或经典映射。
所以,只需在课程中定义它:
class Order(object):
...
items = association_proxy('order_items', 'items')