Flask Таблица ассоциации SQLAlchemy: ошибка при создании backref - PullRequest
1 голос
/ 27 января 2020

У меня есть модель Artist и модель Venue, и у них есть отношение «многие ко многим», поддерживаемое моделью Show (шоу показывают исполнителя, место и дату концерта).

class Venue(db.Model):
__tablename__ = 'Venue'

id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String, unique=True, nullable=False)
shows = db.relationship('Show', backref='venue', lazy=True)   

class Artist(db.Model):
__tablename__ = 'Artist'

id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String, unique=True, nullable=False)
shows = db.relationship('Show', backref='artist', lazy=True)

class Show(db.Model):
  __tablename__ = 'Show'

  id = db.Column(db.Integer, primary_key=True)
  venue_id = db.Column(db.Integer, db.ForeignKey('Venue.id'), nullable=False)
  artist_id = db.Column(db.Integer, db.ForeignKey('Artist.id'), nullable=False)      
  start_time = db.Column(db.DateTime, nullable=False)    
  venue = db.relationship('Venue', back_populates='venue')
  artist = db.relationship('Artist', back_populates='artist')

Я хотел бы получить запрос, чтобы получить название места, исполнителя и дату всех предстоящих концертов, поэтому имел в виду следующее ...

upcoming_shows = Show.query.filter_by(show.start_time >= datetime.now()).all()

... так, чтобы я может затем получить доступ, например, к upcoming_shows [0] .Venue.name, upcoming_shows [0] .Artist.name и upcoming_shows [0] .start_time.

Этот запрос, однако, возвращает следующее:

sqlalchemy.ex c .ArgumentError: Ошибка создания backref 'place' для отношения 'Venue.shows': свойство этого имени существует в mapper 'mapped class Show-> Show'

Чувствую, что я рядом, но упускаю что-то фундаментальное!

Ответы [ 2 ]

1 голос
/ 28 января 2020

решаемая. Я внес изменения в код ниже, и теперь он работает. В конце концов, это было довольно просто, я просто должен был убедиться, что имена отношений уникальны: - \

class Venue(db.Model):
__tablename__ = 'Venue'

id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String, unique=True, nullable=False)
venue_shows = db.relationship('Show', back_populates='venue', lazy=True)   

class Artist(db.Model):
__tablename__ = 'Artist'

id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String, unique=True, nullable=False)
artist_shows = db.relationship('Show', back_populates='artist', lazy=True)

class Show(db.Model):
  __tablename__ = 'Show'

  id = db.Column(db.Integer, primary_key=True)
  venue_id = db.Column(db.Integer, db.ForeignKey('Venue.id'), nullable=False)
  artist_id = db.Column(db.Integer, db.ForeignKey('Artist.id'), nullable=False)    

  start_time = db.Column(db.DateTime, nullable=False)

  venue = db.relationship('Venue', back_populates='venue_shows')
  artist = db.relationship('Artist', back_populates='venue_artist')
0 голосов
/ 05 февраля 2020

Вот общий пример того, что вы ищете

class Association(Base):
    __tablename__ = 'association'
    left_id = Column(Integer, ForeignKey('left.id'), primary_key=True)
    right_id = Column(Integer, ForeignKey('right.id'), primary_key=True)
    extra_data = Column(String(50))
    child = relationship("Child", back_populates="parents")
    parent = relationship("Parent", back_populates="children")

class Parent(Base):
    __tablename__ = 'left'
    id = Column(Integer, primary_key=True)
    children = relationship("Association", back_populates="parent")

class Child(Base):
    __tablename__ = 'right'
    id = Column(Integer, primary_key=True)
    parents = relationship("Association", back_populates="child")

Более подробную информацию смотрите в документации

...