У меня проблемы с множественным наследованием в 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",
}