Jeden z tutejszych problemów jest to, że starają się obecnie używać kolumn tabeli w relacji foreign_keys
zamiast atrybutów klasy.
Oznacza to, że zamiast używać posts.id
, powinieneś używać Post.id
. (W rzeczywistości, aby odnieść się do kolumny tabeli, musisz użyć posts.c.id
).
Tak, to jest możliwe, że oryginalny kod będzie działać, jeśli go poprawić do:
class User(UserMixin, db.Model):
__tablename__ = 'users'
id = db.Column(db.Integer, primary_key=True)
...
post = db.relationship('Post', foreign_keys='Post.id', backref='post_user', lazy='dynamic')
post_blame = db.relationship('Post', foreign_keys='Post.moderated_by', backref='post_blame', lazy='dynamic')
Jeśli nie, to istnieje kilka innych opcji. Po pierwsze, możesz ustanowić te relacje w klasie Post
, gdzie jest mniej niejednoznaczne dla sqlalchemy, aby znaleźć relację klucza obcego. Coś jak
class Post(db.Model):
__tablename__ = 'posts'
id = db.Column(db.Integer, primary_key=True)
...
author_id = db.Column(db.Integer, db.ForeignKey('users.id'), nullable=False)
moderated_by = db.Column(db.Integer, db.ForeignKey('users.id'), nullable=False)
post_user = db.relationship(User, foreign_keys=author_id, backref='post', lazy='dynamic')
post_blame = db.relationship(User, foreign_keys=moderated_by, backref='post_blame', lazy='dynamic')
Uwaga: W tej wersji nie musimy przekazać wartość foreign_keys
jako ciąg znaków, możemy po prostu odwołać się bezpośrednio do kolumny w zakresie.
Ewentualnie, jeśli chcą ustanowić te relacje w Użytkownikiem, może trzeba dać sqlalchemy
więcej informacji, za pomocą primaryjoin
... może coś takiego:
class User(UserMixin, db.Model):
__tablename__ = 'users'
id = db.Column(db.Integer, primary_key=True)
...
post = db.relationship('Post', primaryjoin='User.id == Post.id', backref='post_user', lazy='dynamic')
post_blame = db.relationship('Post', foreign_keys='User.id == Post.moderated_by', backref='post_blame', lazy='dynamic')
proszę pisać pełną błędzie traceback. –
Rozwiązane na podstawie tego wątku https://www.reddit.com/r/flask/comments/2o4ejl/af_flask_sqlalchemy_two_foreign_keys_referencing/ – anvd