2016-11-21 2 views
2

Avec SQLAlchemy 1.0.13, est-il possible de supprimer un relationship join d'une classe d'héritage?Suppression de la relation SQLAlchemy avec l'héritage

Dans l'exemple de travail minimal suivant, j'ai un parent et deux types d'enfants. La classe enfant a une relation avec la classe parente. L'AlienChild obtient tous les attributs de Child mais j'aimerais abandonner la relation. Est-ce possible?

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') 

Répondre

1

Du haut de ma tête, la première chose que je voudrais essayer est

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

Ce qui, cependant, se sent un peu bizarre du point de vue de la POO. En outre, si vous NE supprimez PAS la relation de l'une des classes, le backref children s'arrêtera probablement de fonctionner - il ne peut pas renvoyer les instances Child et AlienChild qui résident dans des tables différentes et ne sont en aucun cas liées entre elles. Si vous souhaitez partager uniquement certaines fonctionnalités entre classes, vous pouvez utiliser les classes mixin:

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'