Я до сих пор овладеваю отношениями в 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 он не может определить, что он сопоставлен с отношением.
Что я здесь не так делаю?