sqlalchemy.ex c .ArgumentError: не удается найти свойство с именем "Show" в сопоставленном классе Show-> показывает в этом запросе - PullRequest
0 голосов
/ 03 августа 2020

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

sqlalchemy.exc.ArgumentError: Can't find property named "Show" on mapped class Show->shows in this Query.

Честно говоря, я понятия не имею, как подойти к ее исправлению, и поиск в Google не дал ничего полезного, насколько я мог судить. Кажется, он ищет свойство "Показать", но я не знаю почему. Может кто-нибудь объяснить, что я сделал не так / как это исправить?

Раздел, вызывающий ошибку, - def shows():

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

    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String)
    city = db.Column(db.String(120))
    state = db.Column(db.String(120))
    address = db.Column(db.String(120))
    phone = db.Column(db.String(120))
    image_link = db.Column(db.String(500))
    facebook_link = db.Column(db.String(120))
    genres = db.Column(db.ARRAY(db.String))
    image_link = db.Column(db.String(500))
    facebook_link = db.Column(db.String(120))
    website = db.Column(db.String(300))
    seeking_talent = db.Column(db.Boolean)
    seeking_description = db.Column(db.String(120))
    shows = db.relationship('Show', backref='venue', lazy=True)

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

    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String)
    city = db.Column(db.String(120))
    state = db.Column(db.String(120))
    phone = db.Column(db.String(120))
    genres = db.Column(db.String(120))
    image_link = db.Column(db.String(500))
    facebook_link = db.Column(db.String(120))
    website = db.Column(db.String(300))
    seeking_shows = db.Column(db.Boolean)
    seeking_description = db.Column(db.String(120))
    shows = db.relationship('Show', backref='artist', lazy=True)        

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

    id = db.Column(db.Integer, primary_key=True)
    artist_id = db.Column(db.Integer, db.ForeignKey('artists.id'), nullable = False)
    venue_id = db.Column(db.Integer, db.ForeignKey('venues.id'), nullable = False)
    start_time = db.Column(db.DateTime, nullable = False)

    def __repr__(self):
        return '<Show {} {}>'.format(self.artist_id, self.venue_id)
def shows():
    # displays list of shows at /shows
    # TODO: replace with real venues data.
    #       num_shows should be aggregated based on number of upcoming shows per venue.
  
    allshows = Show.query.options(db.joinedload('Show.Venue'), db.joinedload('Show.Artist')).all()
    data = list(map(Show.detail, allshows))

    return render_template('pages/shows.html', shows=data)

1 Ответ

0 голосов
/ 04 августа 2020

Ошибка возникает из

db.joinedload('Show.Venue')

Из документации :

Опция принимает либо строковое имя атрибута по отношению к родительскому элементу или для большей конкретности может напрямую включать атрибут, связанный с классом

Поскольку текущая сущность создаваемого запроса - Show, опция сначала ищет Show.Show, и всего за Show.Show.Venue. Исправление заключается в использовании определенного имени атрибута (обратная ссылка):

db.joinedload('venue')
...