Я хочу сделать что-то вроде этого:
Код: Выделить всё
class Base(DeclarativeBase):
id: Mapped[UUID] = mapped_column(postgresql.UUID(as_uuid=True), primary_key=True)
Код: Выделить всё
class ParentBase(AbstractConcreteBase, Base):
@declared_attr
def children(cls) -> Mapped["Child"]:
return relationship("Child", back_populates="parent")
class ParentMixin:
attribute1: Mapped[str]
attribute2: Mapped[str]
class ParentType1(ParentMixin, ParentBase):
__tablename__ = "parent_type_1"
type = "type1"
__mapper_args__ = {
"polymorphic_identity": "type1",
"concrete": True,
}
class ParentType2(ParentMixin, ParentBase):
__tablename__ = "parent_type_2"
type = "type2"
__mapper_args__ = {
"polymorphic_identity": "type2",
"concrete": True,
}
Код: Выделить всё
class Child(Base):
__tablename__ = "child"
child_attribute_1: Mapped[str]
child_attribute_2: Mapped[str]
parent_id: Mapped[UUID] = mapped_column(ForeignKey("parent_base.id"))
parent: Mapped["ParentBase"] = relationship(back_populates="children")
sqlalchemy.exc.NoReferencedTableError: Внешний ключ, связанный с Столбцу «child.parent_id» не удалось найти таблицу «parent_base», с помощью которой можно сгенерировать внешний ключ для целевого столбца «id».
Это связано с тем, что ParentBase< /code> не имеет __tablename__. И включение имени таблицы в эту модель приведет к созданию таблицы ParentBase, которая мне не нужна. Затем я изменил ForeignKey("parent_base.id") на ForeignKey(ParentBase.id), но это привело к новой ошибке:
sqlalchemy.exc.InvalidRequestError: невозможно скопировать объект ForeignKey, который ссылается на столбец, не связанный с таблицей. Column('id', Uuid(), table=None, Primary_key=True, nullable=False)
По сути, вместо того, чтобы делать что-то вроде этого:
Код: Выделить всё
class Child(Model):
__tablename__ = 'child'
child_attribute_1: Mapped\[str\]
child_attribute_2: Mapped\[str\]
parent_type_1: Mapped\[Optional\[UUID\]\] = mapped_column(ForeignKey("parent_type_1.id"))
parent_type_2: Mapped\[Optional\[UUID\]\] = mapped_column(ForeignKey("parent_type_2.id"))
@hybrid_property
def parent_id(self):
return self.parent_type_1 or self.parent_type_2
Подробнее здесь: https://stackoverflow.com/questions/790 ... sqlalchemy