链接表中的SQLAclhemy foreign_keys错误[Flask]

卡西马尔巴卡利

我有两个模型Post和Category。

class Post(db.Model):
    __tablename__ = 'posts'
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(80))
    body = db.Column(db.Text)
    timestamp = db.Column(db.DateTime, index=True, default=datetime.utcnow)
    author_id = db.Column(db.Integer, db.ForeignKey('users.id'))
    body_html = db.Column(db.Text)
    comments = db.relationship('Comment', backref='post', lazy='dynamic')

    category_id = db.Column(db.Integer, db.ForeignKey('categories.id'))
    category = db.relationship('Category',
                               backref=db.backref('posts', lazy='dynamic'))




    @staticmethod
    def on_changed_body(target, value, oldvalue, initiator):
        allowed_tags = ['a', 'abbr', 'acronym', 'b', 'blackquote', 'code', 'em', 'i', 'li', 'ol', 'pre', 'strong',
                        'ul', 'h1', 'h2', 'h3', 'p']
        target.body_html = bleach.linkify(bleach.clean(
            markdown(value, output_form='html'),
            tags=allowed_tags, strip=True))

    def to_json(self):
        json_post = {
            'url': url_for('api.get_post', id=self.author_id, _external=True),
            'title': self.title,
            'body': self.body,
            'body_html': self.body_html,
            'author': url_for('api.get_user', id=self.author_id,
                              _external=True),
            'comments': url_for('api.get_post_comments', id=self.id, _external=True),
            'comment_count': self.comments.count(),
            'category': self.category,
            'category_id': self.category_id

        }
        return json_post

    @staticmethod
    def from_json(json_post):
        body = json_post.get('body')
        if body is None or body == '':
            raise ValidationError('post does not have a body')
        return Post(body=body)

db.event.listen(Post.body, 'set', Post.on_changed_body)

class Category(db.Model):
    __tablename__ = 'categories'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(80))

    def to_json(self):
        json_category = {
            'category_id': self.id,
            'category_name': str(self.name),
            'category_url': url_for('api.get_category', id=self.id, _external=True),

        }
        return json_category

    def __str__ (self):
        return '%s' % self.name

通过将以下内容添加到我的帖子模型中,我已成功将帖子链接到其类别,

category_id = db.Column(db.Integer, db.ForeignKey('categories.id'))
category = db.relationship('Category',
                                   backref=db.backref('posts', lazy='dynamic'))

效果很好!现在,我可以为自己的帖子选择任何类别,并使用可以在相应类别下查看它们/category/<name>现在,我正在尝试创建一个API(json),正如您从具有to_json函数的模型中可以看到的那样。我创建了一个视图以查看所有帖子及其相关信息

@api.route('/posts/')
def get_posts():
    page = request.args.get('page', 1, type=int)
    pagination = Post.query.paginate(
        page, per_page=current_app.config['POSTS_PER_PAGE'],
        error_out=False)
    posts = pagination.items
    prev = None
    if pagination.has_prev:
        prev = url_for('api.get_posts', page=page-1, _external=True)
    next = None
    if pagination.has_next:
        next = url_for('api.get_posts', page=page+1, _external=True)
    return jsonify({
        'posts': [post.to_json() for post in posts],
        'prev': prev,
        'next': next,
        'count': pagination.total
    })

但是现在我试图创建一个视图来查看每个类别的所有帖子category/<name>/posts/,所以我认为我需要链接“类别TO帖子”,因为我已经链接了“帖子TO类别”以便能够查看其各自类别下的所有帖子。 。因此,我尝试将以下内容添加到“类别”模型中:

post_id = db.Column(db.Integer, db.ForeignKey('posts.id'))

然后创建一个视图以JSON类别查看帖子,但出现以下错误。

InvalidRequestError:一个或多个映射器初始化失败-无法继续其他映射器的初始化。最初的例外是:无法确定关系Post.category上父/子表之间的联接条件-没有链接这些表的外键。确保引用列与ForeignKey或ForeignKeyConstraint关联,或指定“ primaryjoin”表达式。

最初,我认为它应该是多对多关系,但是它是POSTS的类别,因此它应该是与我将帖子链接到类别时完全相同的一对多关系。我很困惑,我需要添加或修复哪些内容才能使它正常工作?

卡西马尔巴卡利

因此,在@dirn的帮助下,我可以通过访问在Post类中创建的backref帖子来使其工作,该类别为 backref=db.backref('posts', lazy='dynamic'))

在我的路线category/<name>/posts/上,这看起来像

@api.route('/category/<int:id>/posts/') def get_category_posts(id): category = Category.query.get_or_404(id) page = request.args.get('page', 1, type=int) pagination = category.posts.order_by(Post.timestamp.asc()).paginate( page, per_page=current_app.config['COMMENTS_PER_PAGE'], error_out=False) posts = pagination.items prev = None if pagination.has_prev: prev = url_for('api.get_category_posts', page=page - 1, _external=True) next = None if pagination.has_next: next = url_for('api.get_category_posts', page=page + 1, _external=True) return jsonify({ 'posts': [post.to_json() for post in posts], 'prev': prev, 'next': next, 'count': pagination.total })

我的方式访问它是由category.postspagination = category.posts.order_by(Post.timestamp.asc())

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

MySQL 1064错误创建链接表(多对多)

来自分类Dev

sqlite:如何在iOS中启用外键(PRAGMA foreign_keys始终返回0)

来自分类Dev

Flask-SQLAlchemy-模型没有属性“ foreign_keys”

来自分类Dev

在VBA中动态链接表

来自分类Dev

如何在MySQL中链接表

来自分类Dev

计算链接表中的重复项

来自分类Dev

联合查询中的MySQL链接表

来自分类Dev

在VBA中动态链接表

来自分类Dev

无法在链接表中创建数据

来自分类Dev

更新链接表中的记录

来自分类Dev

无法连接对SQL Server链接表的访问-错误消息登录

来自分类Dev

将Microsoft Access ODBC连接错误捕获到SQL Server链接表

来自分类Dev

VBA测试Access链接表是否具有#Num!错误

来自分类Dev

链接表只读

来自分类Dev

在Access中更改链接表中的表名

来自分类Dev

在Access中更改链接表中的表名

来自分类Dev

烧瓶foreign_keys仍然显示AmbiguousForeignKeysError

来自分类Dev

AmbiguousForeignKeysError 即使在指定 foreign_keys 之后

来自分类Dev

从SQLite表中删除并加入链接表

来自分类Dev

结合使用Me.Refresh和ODBC链接表时,防止出现“数据已更改”错误

来自分类Dev

如何从VBA中的链接表中删除记录

来自分类Dev

在Mysql中对链接表进行重复数据删除

来自分类Dev

如何从2个链接表中查找重复项?

来自分类Dev

设置链接表中字段的格式属性

来自分类Dev

查询以从sql中的链接表返回值

来自分类Dev

跨Opaleye中的链接表进行数组聚合

来自分类Dev

2 SQL Server中的GridControl和链接表

来自分类Dev

设置链接表中字段的格式属性

来自分类Dev

在MYSQL中链接表-是否需要外键