首页 > 解决方案 > 一个或多个映射器未能初始化:relationship 'post' 需要一个类或一个映射器参数

问题描述

'''sqlalchemy.exc.InvalidRequestError:一个或多个映射器无法初始化 - 无法继续初始化其他映射器。触发映射器:'映射类评论->评论'。最初的例外是:关系'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

标签: pythonflask-sqlalchemy

解决方案


尝试:

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 文档页面上阅读更多内容。


推荐阅读