尝试理解flask中的多对多关系

问题描述 投票:0回答:1

目前我正在使用 Flask 使用 python 开发一个项目。 我的数据库中需要多对多关系,我使用了这个简单的示例:

https://www.digitalocean.com/community/tutorials/how-to-use-many-to-many-database-relationships-with-flask-sqlalchemy

现在我的问题是,每次我添加带有标签的帖子时,标签都会添加到标签表中(即使它已经存在)并将其链接到“关系”表中...... 但我只想在“关系”表中添加链接。 我做错了什么?

double entry in tag table

Code to add new post

还有 edit_post 页面会是什么样子?刚刚找到了追加和删除方法。

在发布的教程中找到的所有内容

flask many-to-many
1个回答
0
投票

您用作基础的示例非常简单,解释了为多对多关系定义表的基础知识。正如您可能已经注意到的,它可以扩展。

基本上,您希望标签的名称是唯一的。因此,您应该这样标记。

class Tag(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(50), unique=True)

此外,您希望每个帖子仅分配一次特定标签。为此,将两列声明为主键是有意义的。由于主键对于表来说是唯一的,因此您可以确保两列的组合仅出现一次。
为了确保在删除引用条目时从关联表中删除所有条目,我还建议为外键列定义一个额外的级联。

post_tag = db.Table('post_tag',
    db.Column('post_id', 
        db.Integer, 
        db.ForeignKey('post.id', ondelete='CASCADE'), 
        primary_key=True
    ),
    db.Column('tag_id', 
        db.Integer, 
        db.ForeignKey('tag.id', ondelete='CASCADE'), 
        primary_key=True
    )
)

通过对示例的这些扩展,如果在向数据库表添加条目时不满足其中一个条件,则会引发错误。它不会为您执行检查数据库中是否已存在条目的工作。因此,如果您想创建新帖子,您的工作就是检查标签是否已存在或需要创建。

for tag in form.tags.data:
    tag = Tag.query.filter_by(name=tag).first()
    if not tag:
        tag = Tag(name=tag)
    post.tags.append(tag)

数据库及其结构是一个非常综合的主题,我们只能在这里触及它们。您对主题的研究越深入,您想要对表格定义进行的调整就越多。

© www.soinside.com 2019 - 2024. All rights reserved.