Полиморфизм в Sqlalchemy отношений - PullRequest
0 голосов
/ 27 января 2020

У меня есть модель SqlAchemy, которая связана с наследованием одной таблицы, например:

@Schema(nested=['sensor', 'mad_version', 'serial_interface'], fields=('sensor',))
class Mad(sql.Model):
    #columns...
    serial_interface = relationship(SerialInterface, uselist=False, cascade="all, delete-orphan")

@Schema(nested=['serial_protocol'])
class SerialInterface(sql.Model, InheritanceModel):
    id = sql.Column(types.Integer, primary_key=True)
    transmission_rate = sql.Column(types.Integer)

    mad_id = sql.Column(types.Integer, sql.ForeignKey('mad.id'))
    serial_protocol = sql.relationship(SerialProtocol, uselist=False, cascade="all, delete-orphan")

class RS485(SerialInterface):
    parity = sql.Column(EnumSmart(Parity))
    data_bits = sql.Column(types.Integer)
    stop_bits = sql.Column(types.Integer)

    polymorphic_identity = SerialTypes.RS485.name

class Ethernet(SerialInterface):
    #Others Columns

Я сомневаюсь, как я могу запросить модель Mad и вернуть атрибут Child? Потому что теперь он возвращает SerialInterface только если его собственные атрибуты (без дочерних атрибутов). Я видел в документации, что я могу использовать with_polymorphic в полиморфизме, но этот полиморфизм находится внутри отношений, есть ли способ перезаписать запрос отношений?

1 Ответ

0 голосов
/ 31 января 2020

Я нашел решение, добавив 'with_polymorphic': '*' в __mapper_args__, например:

@declared_attr
def __mapper_args__(cls):
   return {
      'polymorphic_identity': cls.__name__,
      'polymorphic_on': cls.type,
      'with_polymorphic': '*'
   }

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...