Một trong những vấn đề ở đây là bạn đang cố gắng sử dụng các cột bảng trong mối quan hệ foreign_keys
, chứ không phải là thuộc tính lớp.
Tức là, thay vì sử dụng posts.id
, bạn nên sử dụng Post.id
. (Thực tế, để tham khảo cột bảng, bạn sẽ cần phải sử dụng posts.c.id
).
Vì vậy, nó có thể là mã ban đầu của bạn sẽ có tác dụng nếu bạn khắc phục nó để:
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')
Nếu không, sau đó có một vài lựa chọn khác. Đầu tiên, bạn có thể thiết lập các mối quan hệ này trong lớp Post
, nơi mà nó ít mơ hồ hơn đối với sqlalchemy để tìm mối quan hệ khóa ngoại. Một cái gì đó như
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')
Lưu ý trong phiên bản này, chúng tôi không cần phải vượt qua giá trị foreign_keys
như là một chuỗi, chúng tôi chỉ có thể tham khảo trực tiếp đến cột trong phạm vi.
Ngoài ra, nếu bạn muốn thiết lập các mối quan hệ trong tài khoản, bạn có thể bạn cần phải cung cấp cho sqlalchemy
biết thêm thông tin, bằng cách sử dụng primaryjoin
... có lẽ cái gì đó như:
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')
Xin vui lòng gửi traceback lỗi đầy đủ. –
Được giải quyết dựa trên chủ đề này https://www.reddit.com/r/flask/comments/2o4ejl/af_flask_sqlalchemy_two_foreign_keys_referencing/ – anvd