AttributeError: объект «InstrumentedList» не имеет атрибута

У меня есть эти таблицы таблиц:

class Thing(Base):
    __tablename__ = 'thing'
    id = Column(Integer, primary_key=True)

class User(Base):
    __tablename__ = 'user'
    id = Column(Integer, primary_key=True)

class Voteinfo(Base):
    __tablename__ = 'voteinfo'
    thing_id = Column(Integer, ForeignKey('thing.id'), primary_key=True)
    thing = relationship('Thing', backref='voteinfo')
    upvotes = Column(Integer)
    downvotes = Column(Integer)

    def __init__(self, thing)
        self.thing = thing

class VoteThing(Base):
    __tablename__ = 'votething'
    id = Column(Integer, primary_key=True)
    voter_id = Column(Integer, ForeignKey('voter.id'))
    voter = relationship('Voter', backref='votescast')
    thing_id = Column(Integer, ForeignKey('thing.id'))
    thing = relationship('Thing', backref='votesreceived')
    value = Column(Boolean)

    def __init__(self, voter, thing, value):
        if value is True:
            thing.voteinfo.upvotes += 1
        else:
            thing.voteinfo.downvotes += 1

Когда я пытаюсь запустить это, я получаю этот код ошибки в предложении «если значение равно True»:

AttributeError: 'InstrumentedList' object has no attribute 'upvotes'

Я попытался дать Voteinfo свой собственный уникальный идентификатор и добавить к отношениям uselist=False. Я пробовал заменить отношение к вещи с VoteThing на Voteinfo, но это тоже не помогло. Я не знаю, что такое InstrumentedList. Что здесь происходит?


person Jonathan Ong    schedule 06.10.2011    source источник
comment
поскольку thing является параметром __init__, предположительно вы передаете его при создании экземпляра VoteThing. Так что ты проходишь?   -  person Daniel Roseman    schedule 06.10.2011
comment
Да, я передаю вещь: вещь1 = Вещь(), пользователь1 = Пользователь(), voiceinfo1 = Voteinfo(thing1), voicething1 = VoteThing(пользователь1, вещь1, Истина)   -  person Jonathan Ong    schedule 06.10.2011


Ответы (1)


Как поясняется в документации, здесь: https://docs.sqlalchemy.org/en/latest/orm/basic_relationships.html#one-to-one нужно добавить uselist=False не в отношение, а в обратную ссылку.

thing = relationship('Thing', backref=backref('voteinfo', uselist=False))
person madjar    schedule 06.10.2011