我正在开发一个管理包含笔记的数据库的 Flask 应用程序。这些注释可以相互引用。使用表注意的自引用多对多关系可以正常工作,但现在我试图防止用户重复引用。我想我应该这样写:“如果您要创建的引用已经存在,请显示一条消息并重定向到您来自的页面。”我已经为此寻找过例子,但我没有找到它们,而且我自己的努力似乎没有用。
这是我的模型:
from datetime import datetime
from app import db
references = db.Table('references',
db.Column('refers_id', db.Integer, db.ForeignKey('note.id')),
db.Column('is_referred_id', db.Integer, db.ForeignKey('note.id')))
class Note(db.Model):
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(140), index=True, unique=True)
timestampCr = db.Column(db.DateTime, index=True, default=datetime.utcnow)
content = db.Column(db.Text)
external_source = db.Column(db.String(300))
internal_document = db.Column(db.String(300))
timestampRe = db.Column(db.DateTime, index=True, default=datetime.utcnow)
timestampUp = db.Column(db.DateTime, index=True, default=datetime.utcnow)
category = db.Column(db.Boolean, default=False, nullable=False)
referred = db.relationship(
'Note', secondary=references,
primaryjoin=(references.c.refers_id == id),
secondaryjoin=(references.c.is_referred_id == id),
backref=db.backref('references', lazy='dynamic'), lazy='dynamic')
def __repr__(self):
return '[Note] {}' .format(self.title)
这里的观点: `
@app.route("/addref/<id>", methods=['GET', 'POST'])
def addref(id):
form = RefNoteForm()
noteref = Note.query.filter_by(id=id).first_or_404()
if form.validate_on_submit():
refnote = form.opts.data
if refnote==noteref:
flash ('A note can´t refer to itself')
return redirect(url_for('readnote', id=id))
noteref.referred.append(refnote)
db.session.commit()
return redirect(url_for('readnote', id=id))
return render_template('addref.html', form=form, id=id)`
我试着插入之间
if refnote==noteref:
flash ('A note can't refer to itself')
return redirect(url_for('readnote', id=id))
和
noteref.referred.append(refnote)
Something like:
if noteref.referred(refnote:
flash ('This reference already exists')
return redirect(url_for('readnote', id=id))
And all kinds of syntactical variations but I can't get it working.
What is the right syntax for what I am trying to do or should I approach the problem in a different way?