一个或多个映射器未能初始化:关系“ post”期望一个类或一个映射器参数

时间:2020-04-20 11:19:51

标签: python flask-sqlalchemy

'''sqlalchemy.exc.InvalidRequestError:一个或多个映射器初始化失败-无法继续进行其他映射器的初始化。触发映射器:“映射的类Comment-> comment”。最初的例外是:关系“ post”需要一个类或一个映射器参数(收到:)

我想建立它们之间的关系,但它向我显示了这个错误,我是sqlalchemy的初学者,请解决此问题。 '''

class Posts(db.Model):
Sno = db.Column(db.Integer,primary_key=True)
title = db.Column(db.String(80),unique=False,nullable=False)
slug = db.Column(db.String(21),nullable=False)
content= db.Column(db.String(120),nullable=False)
date = db.Column(db.String(12), unique=True)
img_file = db.Column(db.String(12), unique=False, nullable=True)

class Comment(db.Model):
__tablename__ = 'comment'
Sno = db.Column(db.Integer, primary_key=True)
Name = db.Column(db.String(50),unique=False,nullable=False)
Email = db.Column(db.String(120),nullable=False)
Message = db.Column(db.String(120), nullable=False)
post_sno = db.Column(db.Integer, db.ForeignKey('post.Sno'), unique=False, nullable=False)
post = db.relationship('posts', backref=db.backref('posts', lazy=True))
date = db.Column(db.String(12), unique=True,default=datetime.utcnow)
status = db.Column(db.Boolean,default=False)

def __repr__(self):
    return '<Comment %r>' %self.Name

1 个答案:

答案 0 :(得分:0)

尝试:

class Posts(db.Model):
    columns = your_columns(xyz, abc)
    comment_id = db.Column(
        db.Integer,
        db.ForeignKey('comment.id'),
        nullable=False
    )

class Comment(db.Model):
    columns = your_columns(xyz, abc)
    posts = db.relationship('Posts', backref='comment', lazy=True)

relationship应该指向orm试图从中创建列表的类。因此,orm尝试为每个注释创建Posts的列表。 backref允许您使用.object表示法引用关系的另一端。因此,如果您构建一个Posts,并且想要获得它的Comment如下:

posts = Posts.get_or_404(1)
comment = posts.comment # this is what your "backref" refers to

顺便说一句,我认为您可能混淆了自己的关系。我认为评论与帖子之间是多对一的关系,而不是相反。

如果是这样,应该是这样的:

class Post(db.Model):
    columns = your_columns(xyz, abc)
    comments = db.relationship('Comment', backref='post', lazy=True)

class Comment(db.Model):
    columns = your_columns(xyz, abc)
    post_id = db.Column(
        db.Integer,
        db.ForeignKey('post.id'),
        nullable=False
    )

然后,您可以获得有关此类帖子的所有评论:

post = Post.get_or_404(1)
comments = post.comments

您可以像这样获得每个评论的帖子:

comment = Comment.get_or_404(1)
post = comment.post

您可以在Flask SQLAlchemy doc page上阅读更多内容。