2016-11-21 71 views
2

使用SQLAlchemy 1.0.13,是否可以从继承类中删除relationship join使用继承删除SQLAlchemy关系

在下一个最小的工作示例中,我有一个父母和两种孩子。子类与父类有关系。 AlienChild从Child获取所有属性,但我想放弃关系。这可能吗?

class Parent(Base): 
    __tablename__ = 'parent' 
    id = Column(Integer, primary_key=True) 

class Child(Base): 
    __tablename__ = 'child' 
    id = Column(Integer, primary_key=True) 
    parent_id = Column(Integer, 
         ForeignKey('parent.id', 
         ondelete='CASCADE'), 
         nullable=False) 
    parent = relationship('Parent', 
        backref=backref(
         'children', cascade="all, delete-orphan"), 
        foreign_keys=[parent_id], 
        single_parent=True) 

class AlienChild(Child): 
    __tablename__ = 'alienchild' 
    parent = droprelationship('Parent') 

回答

1

从我的头顶,我会尝试的第一件事是

class AlienChild(Child): 
    __tablename__ = 'alienchild' 
    parent_id = None 
    parent = None 

,然而,从感觉来看OOP点有点奇怪。另外,如果不删除其中一个类的关系,那么backref可能会停止工作 - 它不能返回生活在不同表中的Child和AlienChild实例,它们彼此之间没有任何关系。如果你想只在类之间共享一些功能,你可以使用混合类:

class Parent(Base): 
    __tablename__ = 'parent' 
    id = Column(Integer, primary_key=True) 

class PersonMixin: 
    id = Column(Integer, primary_key=True) 
    name = Column(String) 
    age = Column(Integer) 
    gender = Column(String) 

class HasParentMixin: 
    parent_id = Column(Integer, 
         ForeignKey('parent.id', 
         ondelete='CASCADE'), 
         nullable=False) 
    parent = relationship('Parent', 
        backref=backref(
         'children', cascade="all, delete-orphan"), 
        foreign_keys=[parent_id], 
        single_parent=True) 


class Child(Base, PersonMixin, HasPrentMixin): 
    __tablename__ = 'child' 


class AlienChild(Base, PersonMixin): 
    __tablename__ = 'alienchild'