2013-06-04 3 views
2

나는이처럼 보이는 나무, 다형성 상속을 통해 반영했다 : 문제는 내가 반영 할 필요가있다SQLAlchemy의 중첩 된 상속/다형성 관계

class BaseModel(db.Model):  # Table A in diagram 
    __tablename__ = "entities" 

    id = db.Column(db.BigInteger, primary_key=True, nullable=False, server_default=func.nextval('guid_seq')) 
    type_id = db.Column(db.SmallInteger, db.ForeignKey(EntityTypesModel.id)) 

    __mapper_args__ = { 
     'polymorphic_identity':'entity', 
     'polymorphic_on':type_id, 
     'with_polymorphic':'*' 
    } 

class BrandModel(BaseModel): # Table B, C, D in diagram 
    __tablename__ = 'brands' 

    id = db.Column(db.BigInteger, db.ForeignKey(StufffModel.id), primary_key=True, nullable=False) 
    name = db.Column(db.String, nullable=False) 

    __mapper_args__ = { 
     'polymorphic_identity':ET_BRAND, 
    } 

: 같은 위대한 작품을

 A 
/ | \ 
    B C D 

   A 
     / | \ 
      B C D 
       / \ 
       E F 

여기서 D는 A의 다형성 하위 노드 일뿐만 아니라 lso 다형성 부모 E & F.

내가 선택해야하는 것처럼 보입니다. D는 다형성 자녀가 될 수도 있고 부모가 될 수도 있습니다. 둘 다일 수는 없습니다.

여기에 옵션이 있습니까?

는 편집 : 것 같습니다 있도록

그냥이를 묶어, 나는 나무를 평평하게 끝났다 : D 이제 사라

 A 
/ | \ \ 
B C E F 

하고 제공하는 기능은 (아이들에 E &입니다 에프). 아마 공통 부분을 믹스 인 또는 뭔가 만들 것입니다.

불행하지만이 특정 문제에 더 많은 시간을 할애 할 수 없었습니다.

답변

3

확실히 할 수 있습니다. 아래 코드는 declarative_base을 사용하지만 작동하는 모델 설정을 보여줍니다. D 클래스는 클래스 상속을 사용하는 부모 및 자식입니다. 그러나 polymorphic_identity은 최상위 수준에만 저장됩니다. 모든 적절한 외래 키와 클래스 상속을 설정했는지 확인하십시오.

* 참고 :. 당신 예제, 숫자로 TYPE_ID 정의 그러나 값이 문자열 것 같다 *이 MODELA에 판별 열 TYPE_ID의 백 오프 돼지는 같은

Base = declarative_base(cls=_BaseMixin) 
Base.query = session.query_property() 

class BaseModel(Base): 
    __tablename__ = 'entities' 
    id = Column(Integer, primary_key=True) 
    #type_id = Column(Integer, nullable=False) 
    type_id = Column(String, nullable=False) 
    __mapper_args__ = { 
     'polymorphic_identity': 'entity', 
     'polymorphic_on':type_id, 
     'with_polymorphic':'*' 
    } 

class ModelB(BaseModel): 
    __tablename__ = 'modelB' 
    __mapper_args__ = {'polymorphic_identity': 'modelB'} 
    id = Column(Integer, ForeignKey('entities.id'), primary_key=True) 
    name = Column(String, nullable=False) 

class ModelC(BaseModel): 
    __tablename__ = 'modelC' 
    __mapper_args__ = {'polymorphic_identity': 'modelC'} 
    id = Column(Integer, ForeignKey('entities.id'), primary_key=True) 
    name = Column(String, nullable=False) 

class ModelD(BaseModel): 
    __tablename__ = 'modelD' 
    __mapper_args__ = {'polymorphic_identity': 'modelD'} 
    id = Column(Integer, ForeignKey('entities.id'), primary_key=True) 
    name = Column(String, nullable=False) 

class ModelE(ModelD): 
    __tablename__ = 'modelE' 
    __mapper_args__ = {'polymorphic_identity': 'modelE'} 
    id = Column(Integer, ForeignKey('entities.id'), ForeignKey('modelD.id'), primary_key=True) 
    name = Column(String, nullable=False) 

class ModelF(ModelD): 
    __tablename__ = 'modelF' 
    __mapper_args__ = {'polymorphic_identity': 'modelF'} 
    id = Column(Integer, ForeignKey('entities.id'), ForeignKey('modelD.id'), primary_key=True) 
    name = Column(String, nullable=False) 
+0

그래서이 보인다. 실제로 모델 D E F는 다른 열에 의해 구분됩니다. 아마도 type_inner_id라고 할 수 있습니다. 그러나 ModelD는 type_id 열의 ModelA와 관련하여 다형성을 유지해야합니다. – amirpc

+0

나는 이것이 의미있는 방식이라고 생각하며 확실히 그것을 돼지 뒷받침이라고 부르지 않을 것입니다. 그레이트 당신은 당신을 위해 수용 가능한 솔루션을 발견. – van

+0

어떻게 "Base Ricky (Base)"클래스의 ForeignKey를 BaseModel (Base)의 "entities"테이블로 묶을 수 있습니까? 그것은 계속 내게 주어집니다 : sqlalchemy.exc.NoReferencedTableError –