SQLalchemy UnmappedInstanceError для отношения в Flask - PullRequest
0 голосов
/ 29 сентября 2018

Я до сих пор овладеваю отношениями в SQLalchemy, и я застрял на этом.Я пытаюсь добавить отношения между пользователями в друзья.Я закодировал запрос в маршруте, и проблема возникает, когда я пытаюсь добавить объект пользователя в реляционный атрибут объекта (to_contacts).

Это объект User:

class User(UserMixin, db.Model):
    __tablename__ = 'user'
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.VARCHAR(100), nullable=False)
    first_name = db.Column(db.VARCHAR(45), nullable=False)
    last_name = db.Column(db.VARCHAR(45), nullable=False)
    email = db.Column(db.VARCHAR(100), unique=True, nullable=False)
    password = db.Column(db.CHAR(64))
    to_contacts = association_proxy('to_relations', 'to_contact', creator=lambda to_contact: Friends(to_contact=to_contact, relation_type='Friend'))
    from_contacts = association_proxy('from_relations', 'from_contact')

Прокси-сервер ассоциации ссылается на самоссылающийся объект. Friend:

class Friends(db.Model):
    __tablename__ = 'friends'
    id = db.Column(db.Integer, primary_key=True)
    from_contact_id = db.Column(db.Integer, db.ForeignKey('user.id'))
    to_contact_id = db.Column(db.Integer, db.ForeignKey('user.id'))
    relation_type = db.Column(db.String(100), nullable=True)

    from_contact = db.relationship(User,
                                   primaryjoin=(from_contact_id == User.id),
                                   backref='to_relations')
    to_contact = db.relationship(User,
                                 primaryjoin=(to_contact_id == User.id),
                                 backref='from_relations')

В целях тестирования я жестко закодировал добавление user2 в друзья в user1 на маршруте:

@app.route("/add-friend", methods=['GET', 'POST'])
def add_friend():
    user1 = User.query.filter_by(username='user1').first()
    user2 = User.query.filter_by(username='user2').first()
    query = user1.to_contacts.append(user2)
    db.session.add(query)
    db.session.commit()
    return url_for('index')

«Запрос» - это то, где он идет не так.Я действительно могу получить объект User и прочитать любой атрибут, но при обращении к to_contacts он не может определить, что он сопоставлен с отношением.

Что я здесь не так делаю?

...