Отношение ко многим ко многим - как опросить всех детей - PullRequest
0 голосов
/ 27 мая 2019

Я использую колбу-sqlalchemy, чтобы реализовать отношения многие ко многим. Перепробовал много вариантов, но не смог запросить у всех потомков родителя.

class Participant(db.Model):
    __tablename__='participant'
    __table_args__ = {'extend_existing': True} 

    id = db.Column(db.Integer, primary_key=True)
    email = db.Column(db.String(120), unique=True)
    name = db.Column(db.String(120), unique=False)

    user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
    user = db.relationship("User")

    @staticmethod
    def get_by_user(user):
        return Participant.query.filter_by(user=user).first()

    def __repr__(self):
        return "(Participant '{}')".format(self.email)

    competitions = db.relationship("CompetitionParticipant", back_populates="participant")

class Competition(db.Model): 
    __tablename__='competition'
    __table_args__={'extend_existing':True}

    id=db.Column(db.Integer,primary_key=True)

    name=db.Column(db.String(100),unique=True)
    description=db.Column(db.String(255),unique=True)
    # type=db.Column(db.String(50))#Team,Individual,Practice,etc.
    start_date=db.Column(db.DateTime)
    end_date=db.Column(db.DateTime)
    result_date=db.Column(db.DateTime)

    participants = db.relationship('CompetitionParticipant', back_populates='competition')

    def __repr__(self):
        return "(Competition '{}')".format(self.name)

class CompetitionParticipant(db.Model): 
    __tablename__='competition_participant'
    __table_args__={'extend_existing':True}

    id=db.Column(db.Integer,primary_key=True)
    participant_id=db.Column(db.Integer, db.ForeignKey('participant.id'))
    competition_id=db.Column(db.Integer, db.ForeignKey('competition.id'))

    competition=db.relationship("Competition",back_populates="participants")
    participant=db.relationship("Participant",back_populates="competitions")

    def __repr__(self):
        return "(competition_id, participant_id '{},{}')".format(self.competition_id,self.participant_id)

В этом примере взаимоотношений "многие ко многим", как я буду запрашивать все соревнования, в которых участвует участник?

Я пробовал следующее:

participant.competitions # returns relationship object

все остальное, что я пробовал, было синтаксической ошибкой. Как правильно ORM извлекать все соревнования, в которых участвует участник?

Ответы [ 2 ]

1 голос
/ 27 мая 2019

Если вы, например, хотите получить данные о соревнованиях для конкретного пользователя:

participants = Participant.query.filter_by(id=1).all()

, вы можете перебирать участников и получать данные:

for participant in participants:
    for competition in participant.competitions:
        print(competition.competition.name)
0 голосов
/ 27 мая 2019

Если вы не сможете сделать что-то подобное, если хотите узнать об участнике с id = 1:

participant = Participant.query.get(1)
for item in participant.competitions:
       print(item.name)
...