Python sqlalchemy、Mixin、foreignkeys和declared_attr
我知道在声明性mixin类上用外键声明列时需要@declared_attr,但是我想知道这背后的原因 谢谢:)Python sqlalchemy、Mixin、foreignkeys和declared_attr,python,sqlalchemy,Python,Sqlalchemy,我知道在声明性mixin类上用外键声明列时需要@declared_attr,但是我想知道这背后的原因 谢谢:) 每个模型必须具有唯一的orm属性。如果mixin中的相同属性直接应用于每个子类,那么它们都将具有相同的属性。基本orm属性的副本很容易创建,因为它们不引用任何其他orm属性。对于更复杂的属性,用@declared_attr修饰的函数确保为每个子类创建一个新实例 在插装期间,SQLAlchemy为每个类调用每个声明的attr,并将结果分配给目标名称。通过这种方式,它可以确保为每个子类唯一
每个模型必须具有唯一的orm属性。如果mixin中的相同属性直接应用于每个子类,那么它们都将具有相同的属性。基本orm属性的副本很容易创建,因为它们不引用任何其他orm属性。对于更复杂的属性,用
@declared_attr
修饰的函数确保为每个子类创建一个新实例
在插装期间,SQLAlchemy为每个类调用每个声明的attr,并将结果分配给目标名称。通过这种方式,它可以确保为每个子类唯一且正确地进行复杂映射
请参阅,其中包括此声明的属性示例:
来自sqlalchemy.ext.declarative import声明\u attr
类引用AddressMixin(对象):
@声明属性
def地址_id(cls):
返回列(整数,ForeignKey('address.id'))
类用户(ReferenceAddressMixin,基本):
__tablename_uu='user'
id=列(整数,主键=True)```
#store traces
class ListContainer():
id = Column(Integer, primary_key=True)
# timestamp = Column(DateTime, default=datetime.now())
name = Column(String)
#endclass
#store flow in traces
def list_item(tablename):
class ListItem():
# @declared_attr
# def trace_id(cls):
# return Column(Integer, ForeignKey(tablename+'.id'))
trace_id = Column(Integer, ForeignKey(tablename+'.id'))
id = Column(Integer, primary_key=True)
item_pos = Column(Integer)
# start_ea = Column(BLOB)
# end_ea = Column(BLOB)
#endclass
return ListItem