j'ai un arbre qui ressemble à ceci, qui se traduit par héritage polymorphes:sqlalchemy héritage imbriqué/relations polymorphes
A
/ | \
B C D
Cela fonctionne très bien, comme:
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,
}
Le problème est que je dois réfléchir quelque chose comme ceci:
A
/ | \
B C D
/ \
E F
Où D est non seulement un enfant de a polymorphes mais Il semble que je doive choisir, D peut être un enfant polymorphe ou peut être un parent - il ne peut pas être les deux.
Ai-je des options ici?
EDIT:
Juste pour attacher ceci, je fini par aplatir l'arbre de sorte qu'il ressemble:
A
/ | \ \
B C E F
D est maintenant disparu et la fonctionnalité qu'il a fournies sont les enfants (E & F). Je vais probablement faire des parties communes un mélange ou quelque chose.
Dommage mais je ne pouvais pas passer plus de temps sur ce problème particulier.
donc cela ressemble, il est hors de cochon soutenant la colonne discriminante type_id sur modela. En réalité, les modèles D E F sont discriminés par une autre colonne - peut-être l'appeler type_inner_id. Cependant, ModelD doit rester polymorphe par rapport à ModelA sur la colonne type_id. – amirpc
Je crois que c'est la façon qui a du sens, et certainement ne l'appellerait pas piggy backing. Génial, vous avez trouvé une solution acceptable pour vous. – van
Comment pouvez-vous maintenant lier un ForeignKey d'une classe comme "class Ricky (Base)" vers la table "entities" dans BaseModel (Base)? ça continue à me donner: sqlalchemy.exc.NoReferencedTableError –