FLASK 删除父对象后无法删除对象

FLASK Can't delete an object after deleting it's parent

我有问题。

我正在为自己创建一个学校任务管理器。我希望当我删除作业时,与该作业关联的所有任务也被删除,但它不起作用。

代码如下:

这是 class 课业任务和课业:

class Sw_task(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    task = db.Column(db.String(200), nullable=False)
    date_created = db.Column(db.DateTime(), default=datetime.now())
    duedate = db.Column(db.DateTime())
    details = db.Column(db.String(200))
    user = db.Column(db.String())
    sw = db.Column(db.Integer(), default=0)
    course = db.Column(db.Integer())
    sw_id = db.Column(db.Integer, db.ForeignKey('schoolwork.id', ondelete="CASCADE"))

class Schoolwork(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(), nullable=False)
    value = db.Column(db.Integer())
    team = db.Column(db.Integer(), default = 0 )
    time = db.Column(db.Integer())
    part = db.Column(db.String(500))
    user = db.Column(db.String())
    duedate = db.Column(db.DateTime())
    course = db.Column(db.Integer(), default=0)
    other_infos = db.Column(db.String())
    tasks = db.relationship("Sw_task", backref="schoolwork", passive_deletes=True, cascade='all, delete', lazy=True)

创建任务的代码如下:

@app.route("/sw/<int:id>", methods=["GET", "POST"])
@login_required
def schoolwork_ind(id):
    global now
    schoolwork_current = Schoolwork.query.get(id)
    sw_id = schoolwork_current.id
    sw_tasks = Sw_task.query.all()
    course_id = id
    due_date = schoolwork_current.duedate.date()
    due_in = (due_date - now).days
    from_course = Course.query.get(id)
    course_id = from_course.id
    user = current_user.email
    print(course_id)



    if request.method=="POST" and "taskname" in request.form:
        
        print(user)
        task=request.form["taskname"]
        dated = request.form['duedate']
        date_goodsize = dated.replace("-", "/") 
        sw_course = from_course

        due = datetime.strptime(date_goodsize,"%Y/%m/%d" )
        details = request.form['details']
        new_task = Sw_task(sw_id=sw_id, course=course_id,task=task, duedate=due, user=user, sw=sw_id, details=details)
        db.session.add(new_task)
        db.session.commit()
        redirect_link = "/sw/"+str(sw_id)
        return redirect(redirect_link)

    return render_template("schoolwork.html", sw = schoolwork_current, course=from_course, swtasks=sw_tasks, now=now, duein=due_in)

下面是删除作业的代码:

@app.route('/delete/sw/<int:id>', methods=["GET", "POST"])
def delete_sw(id):
    to_delete = Schoolwork.query.get_or_404(id)
    redirect_var = "/schoolworks" 
    try:
        db.session.delete(to_delete)
        db.session.commit()
    except:
        return"There has been a problem. Please try again"
    
    return redirect(redirect_var)

我真的希望你能帮助我...

我知道这个论坛里有一个类似的 post,但即使这样也不起作用。

尝试将您的 Sw_task.sw_id 列修改为:

sw_id = db.Column(db.Integer, db.ForeignKey('schoolwork.id'))

此外,将您的 Schoolwork.tasks 列更改为:

tasks = db.relationship("Sw_task", backref="schoolwork", cascade='all, delete', lazy=True)

我有一个与此非常相似的项目,上面删除父对象后删除对象的实现对我有用。