Полиморфные связи, Денежные операции, sqlalchemy

Речь о хранении денежных транзакциях. Есть одна общая таблица Transaction которая хранит дату транзакции и ее тип. На нее ссылаются все специфичные транзакции (у каждого вида транзакции какие то свои поля и своя бизнес-логике по работе с ними). Мне нужно, чтобы на 1 запись Transaction была ссылка только у одной специфичной транзакции.
Например:
Транзакции по возврату денег за заказ - будет создано 2 транзакции
Одна для продавца - RefundSellerTransaction (id: 1, transaction_id: 1, amount: -1000)
Вторая для покупателя - RefundUserTransaction (id: 1, transaction_id: 2, amount: 1000)
Как можно догадаться в таблице Transaction должно создаться 2 записи с определенным типом и разными id. 1 Transaction может иметь только одну определенную запись в одной из специфичных таблиц.
Спрашивал у нейронки, говорит использовать полиморфные связи, но не совсем разобрался как с ними работать в моем случае)

class Transaction(Base):
    __tablename__ = "transaction"

    id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)

    transaction_type: Mapped[TransactionType] = mapped_column(PG_ENUM(TransactionType, name="transaction_type"))
    date: Mapped[DateTime] = mapped_column(DateTime(timezone=True), default=func.now())

    seller: Mapped["Seller"] = relationship("Seller", back_populates="seller_transactions", uselist=False)
    user: Mapped["User"] = relationship("User", back_populates="user_transactions", uselist=False)

class SellerRefundTransaction(Base):

    __tablename__ = "seller_refund_transaction"

    id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)

    transaction_id: Mapped[int] = mapped_column(ForeignKey('transaction.id'))
    seller_id: Mapped[int] = mapped_column(ForeignKey("seller.id"))
    user_id: Mapped[int] = mapped_column(ForeignKey("user.id"))
    order_id: Mapped[int] = mapped_column(ForeignKey("order.id"))

    amount: Mapped[int] = mapped_column(Integer)

class SellerRefundTransaction(Base):
    __tablename__ = "user_refund_transaction"

    id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)

    transaction_id: Mapped[int] = mapped_column(ForeignKey('transaction.id'))
    seller_id: Mapped[int] = mapped_column(ForeignKey("seller.id"))
    user_id: Mapped[int] = mapped_column(ForeignKey("user.id"))
    order_id: Mapped[int] = mapped_column(ForeignKey("order.id"))

    amount: Mapped[int] = mapped_column(Integer)

Ответы (0 шт):