Во-первых, обзор базы данных:
competitors
- люди, которые соревнуютсяcompetitions
- вещи, которые люди соревнуютсяcompetition_registrations
- Участники, зарегистрированные для определенного соревнования.event
- "событие" на конкурсе.events_couples
- пара (2 участника), участвующая в соревновании.Во-первых, EventCouple
, класс Python, соответствующий events_couples
, равен:
class EventCouple(Base):
__tablename__ = 'events_couples'
competition_id = Column(Integer, ForeignKey('competitions.id'), primary_key=True)
event_id = Column(Integer, ForeignKey('events.id'), primary_key=True)
leader_id = Column(Integer)
follower_id = Column(Integer)
__table_args__ = (
ForeignKeyConstraint(['competition_id', 'leader_id'], ['competition_registrations.competition_id', 'competition_registrations.competitor_id']),
ForeignKeyConstraint(['competition_id', 'follower_id'], ['competition_registrations.competition_id', 'competition_registrations.competitor_id']),
{}
)
У меня есть класс Python, CompetitorRegistration
, который соответствует записи/строке в competition_registrations
. Участник, который зарегистрирован, может участвовать в нескольких соревнованиях, но либо в качестве "лидера", либо "последователя". Я хотел бы добавить в CompetitorRegistration
атрибут leading
, который представляет собой список EventCouple
, где совпадают символы competition_id
и leader_id
. Это мой класс CompetitorRegistration
, в комплекте с попыткой:
class CompetitorRegistration(Base):
__tablename__ = 'competition_registrations'
competition_id = Column(Integer, ForeignKey('competitions.id'), primary_key=True)
competitor_id = Column(Integer, ForeignKey('competitors.id'), primary_key=True)
email = Column(String(255))
affiliation_id = Column(Integer, ForeignKey('affiliation.id'))
is_student = Column(Boolean)
registered_time = Column(DateTime)
leader_number = Column(Integer)
leading = relationship('EventCouple', primaryjoin=and_('CompetitorRegistration.competition_id == EventCouple.competition_id', 'CompetitorRegistration.competitor_id == EventCouple.leader_id'))
following = relationship('EventCouple', primaryjoin='CompetitorRegistration.competition_id == EventCouple.competition_id and CompetitorRegistration.competitor_id == EventCouple.follower_id')
Однако я получаю:
ArgumentError: Could not determine relationship direction for primaryjoin
condition 'CompetitorRegistration.competition_id == EventCouple.competition_id
AND CompetitorRegistration.competitor_id == EventCouple.leader_id', on
relationship CompetitorRegistration.leading. Ensure that the referencing Column
objects have a ForeignKey present, or are otherwise part of a
ForeignKeyConstraint on their parent Table, or specify the foreign_keys parameter
to this relationship.
Спасибо за любую помощь и дайте мне знать, нужна ли дополнительная информация о схеме.
Кроме того, еще одна моя попытка видна в following
- это не ошибка, но также не дали правильных результатов. (Он присоединился только к competition_id
и полностью игнорировал follower_id
)
Ваше условие leading
смешивает выражение и строку как eval()
ed. А условие following
смешивает операторы Python и SQL: and
в Python - это не то, что вы ожидали отсюда. Ниже приведены исправленные примеры с использованием обоих вариантов:
leading = relationship('EventCouple', primaryjoin=(
(competition_id==EventCouple.competition_id) & \
(competitor_id==EventCouple.leader_id)))
leading = relationship('EventCouple', primaryjoin=and_(
competition_id==EventCouple.competition_id,
competitor_id==EventCouple.leader_id))
following = relationship('EventCouple', primaryjoin=\
'(CompetitorRegistration.competition_id==EventCouple.competition_id) '\
'& (CompetitorRegistration.competitor_id==EventCouple.follower_id)')