【问题标题】:Flask SQLAlchemy Association Table: error creating backrefFlask SQLAlchemy 关联表:创建反向引用时出错
【发布时间】:2020-05-12 15:08:06
【问题描述】:

我有一个 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()

...这样我就可以访问例如,即将到来的节目[0].Venue.name、即将到来的节目[0].Artist.name 和即将到来的节目[0].start_time。

该查询返回以下内容:

sqlalchemy.exc.ArgumentError: 在创建 backref 'venue' 时出错 关系“Venue.shows”:该名称的属性存在于映射器上 '映射类显示->显示'

感觉我很接近但缺少一些基本的东西!

【问题讨论】:

    标签: python flask orm sqlalchemy flask-sqlalchemy


    【解决方案1】:

    解决了。我对代码进行了以下更改,它现在可以工作了。最后它相当简单,我只需要确保关系名称是唯一的:-\

    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')
    

    【讨论】:

      【解决方案2】:

      这是您正在寻找的一般示例

      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")
      

      更多详情请查看documentation

      【讨论】:

        猜你喜欢
        • 2014-12-28
        • 1970-01-01
        • 1970-01-01
        • 2023-03-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-11-22
        • 1970-01-01
        相关资源
        最近更新 更多