如何在Flask应用中正确更新博客文章的标签?

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

我有一个笔记系统,每个笔记可以关联一个或多个标签。

这是我的这部分模型。

tags = db.Table('tags',
                db.Column('tag_id', db.Integer, db.ForeignKey(
                    'tag.id'), primary_key=True),
                db.Column('notes_id', db.Integer, db.ForeignKey(
                    'notes.id'), primary_key=True)
                )


class Notes(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    # ...
    tags = db.relationship('Tag', secondary=tags, lazy='subquery',
                           backref=db.backref('notes', lazy=True))


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

    def __init__(self, name):
        self.name = name

当我更新这个笔记时,我想删除那些不再与我的笔记相关联的标签。我如何才能做到这一点 ?

例如,这是我有的。

@bp.route('/update/<int:id>', methods=['GET', 'POST'])
@login_required
def update(id):
    note = Notes.query.get_or_404(id)

    tags = []
    for e in note.tags:
        tag = Tag.query.get_or_404(e.id)
        tags.append(tag.name)
    tags = ', '.join(tags)

    if request.method == 'POST':
        note.title = request.form.get('title')
        note.content = request.form.get('content')
        note.updated_at = datetime.now()

        # Get a tags list from an input and convert it to string
        tags = request.form.get('tags').split(', ')

        if tags:
            for tag in tags:
                tag_exists = Tag.query.filter_by(name=tag).first()
                if not tag_exists:
                    new_tag = Task(tag)
                    db.session.add(new_tag)
                    note.tags.append(new_tag)
                else:
                    db.session.add(tag_exists)
                    note.tags.append(tag_exists)

        # Want to check if I have to delete tags associations here..

        db.session.add(note)
        db.session.commit()
        return redirect(url_for('notes.index'))
    else:
        if note.owner_id == int(current_user.get_id()):
            return render_template('notes/update.html', note=note, tags=tags)
        else:
            flash("You can't update a page which is not yours", "error")
            return redirect(url_for('notes.index'))

我知道我的代码有点脏,但这是我第一次用Flask做真正的应用,我尽力了🙏

谢谢你的帮助

python flask flask-sqlalchemy
1个回答
1
投票

下面是一个例子,希望对大家有所帮助

# find note which you want change
note = Notes.query.get(3)
# find tag which you want delete
tag = note.tags[0]
note.tags.remove(tag)
db.session.add(note)
db.session.commit()
© www.soinside.com 2019 - 2024. All rights reserved.