SQLAlchemy множественное наследование - PullRequest
0 голосов
/ 04 апреля 2020

У меня проблемы с множественным наследованием в SQLAlchemy. Я читал, что это возможно, но не смог найти хороших примеров.

Я хотел бы смоделировать свои данные следующим образом:

- Layer   

    - VaporLayer

    - SolutionLayer
       - OrganicLayer
       - AqueousLayer

Когда я запрашиваю эти модели в python оболочке я получаю противоречивые результаты. Если я сначала запросю Layer, я получу пустые объекты, которые имеют только поле id и пустое поле layer_type для всех последующих запросов любой модели в этой иерархии. Если я запрашиваю SolutionLayer в новой оболочке, я получаю экземпляры OrganicLayer и AqueousLayer (которые имеют правильные поля layer_type и solution_layer_type), даже когда я запрашиваю Layer. Я попытался адаптировать функцию with_polymorphi c безуспешно, давая те же результаты. В идеале эти запросы всегда будут давать наиболее конкретный класс c (самая дальняя иерархия вниз) или, по крайней мере, последовательно заполнять layer_type

Следующие значения соответствуют моим models.py:

class Layer(Base):
    __tablename__ = "layers"
    id = Column(Integer, primary_key=True)
    layer_volume = Column(Float)
    layer_type = Column(String)

    __mapper_args__ = {
        "polymorphic_identity": "layers",
        "polymorphic_on": layer_type,
    }


class VaporLayer(Layer):
    __tablenema__ = "vapor_layers"
    id = Column(ForeignKey("layers.id"), primary_key=True)
    voltage = Column(Float)
    pressure = Column(Float)
    __mapper_args__ = {"polymorphic_identity":'vapor_layers'}


class SolutionLayer(Layer):
    __tablename__ = "solution_layers"
    id = Column(ForeignKey("layers.id"), primary_key=True)

    spin_speed = Column(Integer)
    spin_duration = Column(Float)
    spin_temp = Column(Float)
    solution_layer_type = Column(String)
    __mapper_args__ = {
        "polymorphic_identity": "solution_layers",
        "polymorphic_on": solution_layer_type,
    }


class OrganicLayer(SolutionLayer):
    __tablename__ = "organic_layers"
    id = Column(ForeignKey("solution_layers.id"), primary_key=True)

    organic_solute = Column(String)
    organic_solvent = Column(String)
    concentration = Column(Float)

    additive = Column(String)
    additive_concentration = Column(Float)

    __mapper_args__ = {
        "polymorphic_identity": "organic_layers",
    }


class AqueousLayer(SolutionLayer):
    __tablename__ = "aqueous_layers"
    id = Column(ForeignKey("solution_layers.id"), primary_key=True)
    solute = Column(String)
    solute_concentration = Column(String)
    solute_batch = Column(String)

    additive = Column(String)
    additive_concentration = Column(Float)

    __mapper_args__ = {
        "polymorphic_identity": "aqueous_layers",
    }

1 Ответ

1 голос
/ 04 апреля 2020

Добавление "polymorphic_on" к __mapper_args__ в классе SolutionLayer, по-видимому, перезаписывает Layer.layer_type и не позволяет ORM определить, к какому классу относится данный объект. Работаем сейчас с этим удалением.

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