Полиморфные связи, Денежные операции, 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)