Как иметь родительскую модель AbstractConcreteBase в SQLAlchemy?Python

Программы на Python
Anonymous
Как иметь родительскую модель AbstractConcreteBase в SQLAlchemy?

Сообщение Anonymous »

Как мне установить связь «один ко многим» между классом AbstractConcreteBase с несколькими полиморфными моделями в качестве родительских моделей и дочерней моделью с 1 внешним ключом? Я знаю, что это можно сделать с помощью нескольких внешних ключей, указывающих на каждую отдельную таблицу, но есть ли способ сделать это, используя всего один?
Я хочу сделать что-то вроде этого:

Код: Выделить всё

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

Вернуться в «Python»