Связь с гибридным атрибутом в качестве внешнего ключа - PullRequest
4 голосов
/ 17 февраля 2020

Я пытаюсь использовать гибридный атрибут в качестве внешнего ключа. В моем классе Transaction у меня есть следующий гибридный атрибут:

@hybrid_property
def target_id(self):
    return self.data_manual.target_id or self.data_inferred.target_id

@target_id.expression
def target_id(cls):
    coalesce(
        select([TransactionManual.target_id]).where(cls.id == TransactionManual.id).as_scalar(),
        select([TransactionInferred.target_id]).where(cls.id == TransactionInferred.id).as_scalar())

Если transaction_id установлен автоматически, он сохраняется в таблице TransactionInferred, и если он установлен вручную пользователем он хранится в таблице TransactionManual (TransactionInferred и TransactionManual имеют тот же идентификатор, что и Transaction). Ручное значение переопределяет автомат c один.

Как бы я тогда go о создании отношений?

Первоначально у меня был

@property
def target():
    Target.query.filter(Target.id == self.target_id).first()

, который работает, но я не могу использовать его в запросах.

Я пробовал

target = db.relationship(Target, foreign_keys='Transaction.target_id', primaryjoin='Transaction.target_id == Target.id')

и десятки его вариантов, но ни один из них не работал. SQLAlchemy обычно жалуется на то, что нет никаких внешних ключей, связывающих таблицы.

Любая помощь будет высоко оценена, спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...