При запросе определенного подкласса (дочернего) в наследовании будут отображаться атрибуты базового класса (родительского) в дополнение к атрибутам подкласса. - PullRequest
0 голосов
/ 17 февраля 2019

Я новичок в sqlalchemy-ORM и не знаю, что добавить в мой код, чтобы дочерняя таблица видела атрибуты родительской таблицы + свои собственные атрибуты.

Я создаюбаза данных, использующая sqlalchemy-ORM .i, наследовала таблицу соединений между таблицей «устройство» (базовый класс), «концентратор» и «контроллер» (подклассы).по умолчанию базовый класс видит свои собственные атрибуты и подклассы, но что, если я захочу сделать наоборот?Моя проблема в том, что подкласс в моем коде видит только свои собственные атрибуты, и я хочу, чтобы он видел и родительский, и свои собственные атрибуты.

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 голосов
/ 18 февраля 2019

То, что вы пытаетесь сделать, - это сохранить большую часть информации на вашем объекте Device, а затем дифференцировать ее, связав ее с записью в отдельных таблицах, называемых Hub и Controller.Например, если у вас есть 2 контроллера и один концентратор:

===============================================
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
===================

Хотя подобное может иметь смысл в других случаях, оно не использует преимущества используемой вами реляционной базы данных.Вместо этого я бы предложил одну таблицу для всех ваших устройств, а затем связал бы их со второй таблицей типов устройств:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...