在继承中查询特定的子类(子级)将呈现基类(父级)属性以及子类属性

时间:2019-02-17 19:21:32

标签: python orm sqlalchemy

我是sqlalchemy-ORM的新手,我不知道要在代码中添加什么以使子表看到父表的属性及其自身的属性。

我正在使用sqlalchemy-ORM创建数据库。我在'device'表(基类),'hub'和'controller'(子类)之间进行了联接表继承。默认情况下,基类会看到其自身和子类的属性,但是如果我想反过来怎么办。我的问题是代码中的子类只能看到其自身的属性,而我希望它既可以看到父级又可以看到其自身的属性。

class Device(Base):
    __tablename__ = "device"
    id = Column('id' , Integer , primary_key=True)
    name = Column('name' , String)
    status = Column('status', Boolean)
    room_id = Column(Integer , ForeignKey('room.id'))
    type = Column('type' , String)

    __mapper_args__ = {'polymorphic_identity':'device', 'polymorphic_on': type
        }

class Hub(Device):
    __tablename__ = "hub"
    id = Column('id' ,Integer , ForeignKey('device.id'), primary_key=True)      
    __mapper_args__ = {'polymorphic_identity':'hub'
        }

class Controller(Device):
    __tablename__ = "controller"
    id = Column('id' , Integer , ForeignKey('device.id'), primary_key=True)     
    __mapper_args__ = {'polymorphic_identity':'controller'
        }

1 个答案:

答案 0 :(得分:0)

您似乎想做的是将大多数信息存储在Device对象上,然后通过将其链接到称为Hub和Controller的单独表中的记录来区分它们。例如,如果您有2个控制器和1个集线器:

===============================================
Table: "device"
id    name        status    room_id    type  
===============================================
1    Hub A         True          1     Hub  
2    Troller A     True          1     Troll 
3    Troller B     False         8     Troll 
===============================================

============
Table: "hub"
id  
============
1
============

===================
Table: "controller"
id 
===================
2
3
===================

虽然在其他情况下类似的事情可能有意义,但是它没有利用您正在使用的关系数据库。相反,我建议只为您的设备的 all 个表,然后将它们链接到第二个设备类型表:

class Device(Base):
    __tablename__ = 'device'
    id = Column(Integer, primary_key=True)
    name = Column(String)
    status = Column(Boolean)
    room_id = Column(Integer, ForeignKey('room.id')
    type_id = Column(Integer, ForeignKey('device_type.id')
    type = relationship('DeviceType', backref='devices')

class DeviceType(Base):
    __tablename__ = 'device_type'
    id = Column(Integer, primary_key=True)
    name = Column(String)

别忘了from sqlalchemy.orm import relationship。这样,您可以选择一种类型,然后使用关系来获取该类型的所有设备。您将来也可以添加新型设备,而不必添加全新的表。

在这种情况下,上面的相同表格将显示为:

===============================================
Table: "device"
id    name        status    room_id    type_id  
===============================================
1    Hub A        True           1           1 
2    Troller A    True           1           2 
3    Troller B    False          8           3
===============================================

====================
Table: "device_type"
id    name
====================
1     Hub
2     Controller
====================

如果要返回所有控制器的列表,只需查询控制器device_type并使用关系/ backref并获取所有关联的设备:

controller_type = session.query(DeviceType).get(2)
controllers = controller_type.devices