如何指定多于1个backref

时间:2014-11-08 12:13:47

标签: python flask sqlalchemy

我有3个表:用户,帖子和评论。我试图获得评论作者的用户名。

这是我的models.py:

class User(db.Model, UserMixin):
    __tablename__ = 'users'
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.Integer, unique=True, index=True)
    comments = db.relationship('Comment', backref='author', lazy='dynamic')
    #i'm trying to:
    comment_author = db.relationship('Comment', backref='comment_author_username', lazy='dynamic')
class Post(db.Model):
    __tablename__ = 'posts'
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(32), index=True)
    comments = db.relationship('Comment', backref='post', lazy='dynamic')
    body = db.Column(db.Text)
    author_id = db.Column(db.Integer, db.ForeignKey('users.id'))

class Comment(db.Model):
    __tablename__ = 'comments'
    id = db.Column(db.Integer, primary_key=True)
    body = db.Column(db.Text)
    author_id = db.Column(db.Integer, db.ForeignKey('users.id'))
    post_id = db.Column(db.Integer, db.ForeignKey('posts.id'))
#im trying to do:
    #comment_author_username = db.Column(db.String(64), db.ForeignKey('users.username'))

但收到错误:

AmbiguousForeignKeysError: Could not determine join condition between parent/child tables on relationship User.comments - there are multiple foreign key paths linking the tables. Specify the 'foreign_keys' argument, providing a list of those columns which should be counted as containing a foreign key reference to the parent table.

如果我在模板{{comment.author_id}}中使用它可以正常工作(显示评论作者ID),但{{comment.author_id.username}}不显示任何内容。我如何获得评论作者用户名?

1 个答案:

答案 0 :(得分:0)

您正在从表格Usercommentscomment_author)到表格Comment建立两种关系(基本上它们是相同的)。

author_id中的Post有一个db.ForeignKey('users.id'),但Post表中没有引用表User

基本上你想要的是,有一些帖子他们有自己的作者,每个帖子都有一些评论,他们也有他们的作者。您的PostUser之间的关系是一对多,您的PostComment之间的关系也是一一对多即可。 CommentUser之间的关系是一对多。按sqlalchemy,您的表格如下:

class User(db.Model, UserMixin):
    __tablename__ = 'users'
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.Integer, unique=True, index=True)
    posts = db.relationship('Post', backref='poster', lazy='dynamic')
    comments = db.relationship('Comment', backref='commenter', lazy='dynamic')

class Post(db.Model):
    __tablename__ = 'posts'
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(32), index=True)
    body = db.Column(db.Text)
    user_id = db.Column(db.Integer, db.ForeignKey('users.id'))
    comments = db.relationship('Comment', backref='comment_on_post', lazy='dynamic')

class Comment(db.Model):
    __tablename__ = 'comments'
    id = db.Column(db.Integer, primary_key=True)
    body = db.Column(db.Text)
    user_id = db.Column(db.Integer, db.ForeignKey('users.id'))
    post_id = db.Column(db.Integer, db.ForeignKey('posts.id'))

如果要添加数据,您可以这样做:

s = db.session

user = User(username='Alex')
post = Post(title='First try', body='This is my first try!')
comment = Comment(body='This is a useful post!')

user.posts.append(post)
user.comments.append(comment)
post.comments.append(comment)

s.add(user)
s.add(post)
s.add(comment)

s.commit()
s.close()

和检索数据:

s = db.session
comments = models.Comment.query.all()
for c in comments:
    print c.user_id
s.close()