我有一个笔记系统,每个笔记可以关联一个或多个标签。
这是我的这部分模型。
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做真正的应用,我尽力了🙏
谢谢你的帮助
下面是一个例子,希望对大家有所帮助
# 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()