如何在 Flask 视图中使用多对多字段?

Posted

技术标签:

【中文标题】如何在 Flask 视图中使用多对多字段?【英文标题】:How to use many-to-many fields in Flask view? 【发布时间】:2016-01-16 15:44:55 【问题描述】:

我正在尝试使用 Flask 创建博客。每个帖子都可以有多个标签,每个标签也可以与多个帖子相关联。所以我创建了一个多对多的关系。我的问题是如何在创建新帖子时保存多个标签。而且由于每个帖子都可以有不同数量的标签,我如何在表格中显示它?另外,我如何在帖子中创建新标签,然后将这些标签与其他帖子一起使用? 这是models.py -

postcategory = db.Table('tags',
    db.Column('posts_id', db.Integer, db.ForeignKey('posts.id')),
    db.Column('categories_id', db.Integer, db.ForeignKey('categories.id'))
)

class Post(db.Model):
    __tablename__ = 'posts'
    id = db.Column(db.Integer, primary_key=True)     
    title = db.Column(db.String)
    content = db.Column(db.Text)
    slug = db.Column(db.String, unique=True)
    published = db.Column(db.Boolean, index=True)
    timestamp = db.Column(db.DateTime, index=True)
    categories = db.relationship('Category', secondary=postcategory, backref='posts' )

    def __init__(self, title, content):
        self.title = title
        self.content = content

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

这是我正在处理的视图 -

def create_article():
    if request.method == 'POST':
        if request.form.get('title') and request.form.get('content') and request.form.get('slug') and request.form.get('published'):
            post = Post(request.form['title'], request.form['content'], request.form['slug'], request.form['published'])

我确信有一个简单的解决方案,我只是把它复杂化了,但我是 web 开发的新手,所以请帮忙。

【问题讨论】:

我放了我正在处理的视图,我如何从模板中获取类别? 【参考方案1】:

您可以使用getlist 将类别从表单中拉出,并将它们添加到 Post 对象。如果您有如下复选框:

<form>
    <input type="checkbox" name="categories" value="foo">
    <input type="checkbox" name="categories" value="bar" checked>
</form>

在您的视图方法中,您可以这样做:

categories_from_form = request.form.getlist('categories') # ['bar']
# create Category objects with the form data
categories = [Category(title=title) for title in categories_from_form]

post = Post(request.form['title'], request.form['content'], request.form['slug'], request.form['published'])
post.categories = categories # attach the Category objects to the post
...

【讨论】:

然后您应该查询该类别并将其添加到 ORM 对象的categories 列表中。这是get_or_create 模型实例的一种方法。 ***.com/a/6078058/2178164

以上是关于如何在 Flask 视图中使用多对多字段?的主要内容,如果未能解决你的问题,请参考以下文章

深入浅出Flask(50):flask_sqlalchemy的创建多对多的关系表

SqlAlchemy 和 Flask,如何查询多对多关系

我们如何在 django 管理搜索字段中搜索多对多字段

如何在多对多关系中使用带有可编辑字段的 TabularInline?

一对一、一对多、多对多,如何设计数据表?

Flask-msearch python ,在多对多表上添加 msearch