Python 使用联接表继承时,将Mixin添加到每个子类表中
我有以下设置:Python 使用联接表继承时,将Mixin添加到每个子类表中,python,sqlalchemy,pyramid,Python,Sqlalchemy,Pyramid,我有以下设置: class Attribute(object): a = Column(Integer) class Thing(Base, Attribute): b = Column(Integer) class Subthing(Thing): c = COlumn(Integer) 但是,Thing和Subthing都将具有属性mixin,这意味着它们都将具有在属性中指定的列: Thing: a | b Subthing: a | c 我只希望这些mixi
class Attribute(object):
a = Column(Integer)
class Thing(Base, Attribute):
b = Column(Integer)
class Subthing(Thing):
c = COlumn(Integer)
但是,Thing和Subthing都将具有属性mixin,这意味着它们都将具有在属性中指定的列:
Thing: a | b
Subthing: a | c
我只希望这些mixin列出现在Thing中,而不是子内容中:
Thing: a | b
Subthing: c
这是可能的,还是我必须手动创建列和方法,而不是对每件事都使用mixin?
子项
根据继承的定义从父项获取a
。如果您不希望该行为,则子项
无法从该对象继承。一个可能的解决方案是引入另一个基类
class Attribute(object):
@declared_attr # the actual syntax on SQLAlchemy for doing mixins
def a(cls):
return Column(Integer)
class BaseThing(Base):
pass
class Thing(BaseThing, Attribute):
b = Column(Integer)
class Subthing(BaseThing):
c = Column(Integer)
然后子项只有列
c
,而Thing有a
,bsubting
根据继承的定义从父项获取a
。如果您不希望该行为,则子项
无法从该对象继承。一个可能的解决方案是引入另一个基类
class Attribute(object):
@declared_attr # the actual syntax on SQLAlchemy for doing mixins
def a(cls):
return Column(Integer)
class BaseThing(Base):
pass
class Thing(BaseThing, Attribute):
b = Column(Integer)
class Subthing(BaseThing):
c = Column(Integer)
然后子项只有列c
,而东西有a
,和b
,我刚刚遇到了同样的问题。事实证明,如果在mixin类中使用@declared\u attr
定义列,SQLAlchemy的行为正常。使用联接表继承时,直接在mixin中声明的列会泄漏到子类中。我也遇到了同样的问题。事实证明,如果在mixin类中使用@declared\u attr
定义列,SQLAlchemy的行为正常。使用联接表继承时,直接在mixin中声明的列会泄漏到子类中。这是一种行为不一致性,是由于@declared_attr的行为慢慢偏离了仅针对“column copy”用例测试的行为契约而产生的。“column on mixin”最初的用例是将它平等地应用于所有继承类,但是@declared_attr(开发时间稍晚)没有采用这种行为,因此不一致
将“column copy”更改为仅对非子类生效是一种向后不兼容的行为更改,仅在即将发布的0.8中也是如此。这是2565号车票(http://www.sqlalchemy.org/trac/ticket/2565)并在r9baa197f2c67中解析
测试:
这是由于@declared_attr的行为慢慢偏离了仅针对“column copy”用例进行测试的行为契约而导致的行为不一致。“column on mixin”最初的用例是将它平等地应用于所有继承类,但是@declared_attr(开发时间稍晚)没有采用这种行为,因此不一致
将“column copy”更改为仅对非子类生效是一种向后不兼容的行为更改,仅在即将发布的0.8中也是如此。这是2565号车票(http://www.sqlalchemy.org/trac/ticket/2565)并在r9baa197f2c67中解析
测试:
这在我看来是完全正常的:子项继承自Thing,Thing继承自属性。为什么子处理会神奇地不从其父级继承?还有,它也从哪个“基”继承?在单表继承和联接表继承的情况下,它对我来说没有实际意义。属性将被无故覆盖。@Mel:Base
是由sqlalchemy.ext.declarative.declarative\u Base
返回的基类的惯用名称。这在我看来完全正常:子项是从Thing继承的,而Thing是从Attribute继承的。为什么子处理会神奇地不从其父级继承?还有,它也从哪个“基”继承?在单表继承和联接表继承的情况下,它对我来说没有实际意义。属性将被无故覆盖。@Mel:Base
是sqlalchemy.ext.declarative.declarative\u Base
返回的基类的常用名称。