This is a duplicate from: 
http://stackoverflow.com/questions/43972912/abstract-table-concrete-inheritance-could-not-determine-join-condition-between
I've got following example code:

models.py
 
   class CadastralObject(Base):
        __tablename__ = 'cadastral_object'
        def __init__(self, cadastral_region, cadastral_district, 
cadastral_block, cadastral_object):
            self.cadastral_region = cadastral_region
            self.cadastral_district = cadastral_district
            self.cadastral_block = cadastral_block
            self.cadastral_object = cadastral_object
    
        # this is a combined PK
        cadastral_region = Column(Integer, primary_key=True, index=True)
        cadastral_district = Column(Integer, primary_key=True, index=True)
        cadastral_block = Column(Integer, primary_key=True, index=True)
        cadastral_object = Column(Integer, primary_key=True, index=True)
    
        encumbrances = relationship("Encumbrance")

    class Encumbrance(Base):
        __tablename__ = 'encumbrance'
        id = Column(Integer, primary_key=True, index=True)
        def __init__(self, cadastral_object):
            self.parent_cadastral_region = cadastral_object.cadastral_region
            self.parent_cadastral_district = cadastral_object.
cadastral_district
            self.parent_cadastral_block = cadastral_object.cadastral_block
            self.parent_cadastral_object = cadastral_object.cadastral_object
    
        # FK fields
        parent_cadastral_region = Column(Integer, nullable=False)
        parent_cadastral_district = Column(Integer, nullable=False)
        parent_cadastral_block = Column(Integer, nullable=False)
        parent_cadastral_object = Column(Integer, nullable=False)
    
        parent_object = relationship(CadastralObject)
        __table_args__ = (ForeignKeyConstraint(
            [
                parent_cadastral_region,
                parent_cadastral_district,
                parent_cadastral_block,
                parent_cadastral_object],
            [
                CadastralObject.cadastral_region,
                CadastralObject.cadastral_district,
                CadastralObject.cadastral_block,
                CadastralObject.cadastral_object]),
                          {}
        )

this code works as intended:

main.py

    c = CadastralObject(1, 2, 3, 4)
    session.add(c)
    e = Encumbrance(c)
    session.add(e)
    session.commit()
    print(c.encumbrances)
    print(e.parent_object)


results:

    [<app.models.Encumbrance object at 0x000001C9B820BCC0>]
    <app.models.CadastralObject object at 0x000001C9B820BB00>


however, when I'm trying convert my code to Concrete Inheritance:

imodels.py

    class iCadastralObject(AbstractConcreteBase, Base):
    
        def __init__(self, cadastral_region, cadastral_district, 
cadastral_block, cadastral_object):
            self.cadastral_region = cadastral_region
            self.cadastral_district = cadastral_district
            self.cadastral_block = cadastral_block
            self.cadastral_object = cadastral_object
    
        # this is a combined PK
        cadastral_region = Column(Integer, primary_key=True, index=True)
        cadastral_district = Column(Integer, primary_key=True, index=True)
        cadastral_block = Column(Integer, primary_key=True, index=True)
        cadastral_object = Column(Integer, primary_key=True, index=True)
    
        @declared_attr
        def encumbrances(self):
            return relationship("iEncumbrance")

    
    
    class Building(iCadastralObject):
        __tablename__ = 'building'
    
        __mapper_args__ = {
            'polymorphic_identity': 'building',
            'concrete': True
        }
    
        @declared_attr
        def encumbrances(self):
            return relationship("iEncumbrance")
    
    
    class Flat(iCadastralObject):
        __tablename__ = 'flat'
    
        __mapper_args__ = {
            'polymorphic_identity': 'flat',
            'concrete': True
        }
    
        @declared_attr
        def encumbrances(self):
            return relationship("iEncumbrance")
    
    
    class Construction(iCadastralObject):
        __tablename__ = 'construction'
    
        __mapper_args__ = {
            'polymorphic_identity': 'construction',
            'concrete': True
        }
    
    
    class iEncumbrance(Base):
        __tablename__ = 'iencumbrance'
    
        id = Column(Integer, primary_key=True, index=True)
    
        def __init__(self, cadastral_object):
            self.parent_cadastral_region = cadastral_object.cadastral_region
            self.parent_cadastral_district = cadastral_object.
cadastral_district
            self.parent_cadastral_block = cadastral_object.cadastral_block
            self.parent_cadastral_object = cadastral_object.cadastral_object
    
        # FK fields
        parent_cadastral_region = Column(Integer, nullable=False)
        parent_cadastral_district = Column(Integer, nullable=False)
        parent_cadastral_block = Column(Integer, nullable=False)
        parent_cadastral_object = Column(Integer, nullable=False)
    
        parent_object = relationship(iCadastralObject)
    
        __table_args__ = (ForeignKeyConstraint(
            [
                parent_cadastral_region,
                parent_cadastral_district,
                parent_cadastral_block,
                parent_cadastral_object],
            [
                iCadastralObject.cadastral_region,
                iCadastralObject.cadastral_district,
                iCadastralObject.cadastral_block,
                iCadastralObject.cadastral_object]),
                          {}
        )




I'm getting an error on "from app.imodels import Building"

    sqlalchemy.exc.NoForeignKeysError: Could not determine join condition 
between parent/child tables on relationship iCadastralObject.encumbrances - 
there are no foreign keys linking these tables.  Ensure that referencing 
columns are associated with a ForeignKey or ForeignKeyConstraint, or 
specify a 'primaryjoin' expression.






-- 
SQLAlchemy - 
The Python SQL Toolkit and Object Relational Mapper

http://www.sqlalchemy.org/

To post example code, please provide an MCVE: Minimal, Complete, and Verifiable 
Example.  See  http://stackoverflow.com/help/mcve for a full description.
--- 
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to sqlalchemy+unsubscr...@googlegroups.com.
To post to this group, send email to sqlalchemy@googlegroups.com.
Visit this group at https://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/d/optout.

Reply via email to