目前我正在使用 Flask 使用 python 开发一个项目。 我的数据库中需要多对多关系,我使用了这个简单的示例:
现在我的问题是,每次我添加带有标签的帖子时,标签都会添加到标签表中(即使它已经存在)并将其链接到“关系”表中...... 但我只想在“关系”表中添加链接。 我做错了什么?
还有 edit_post 页面会是什么样子?刚刚找到了追加和删除方法。
在发布的教程中找到的所有内容
您用作基础的示例非常简单,解释了为多对多关系定义表的基础知识。正如您可能已经注意到的,它可以扩展。
基本上,您希望标签的名称是唯一的。因此,您应该这样标记。
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)
数据库及其结构是一个非常综合的主题,我们只能在这里触及它们。您对主题的研究越深入,您想要对表格定义进行的调整就越多。