python - Flask-SQLAlchemy 更新一对多记录

标签 python flask sqlalchemy flask-sqlalchemy one-to-many

我有一对多关系模型,这是我的模型的片段:

class ScheduleDayAndTime(db.Model):
    __tablename__ = 'schedule_day_and_time'
    id = db.Column(db.Integer, primary_key=True)
    day = db.Column(db.Enum(DayNameList, name='day'))
    start_at = db.Column(db.Time())
    end_at = db.Column(db.Time())
    requisition_schedule_id = db.Column(db.Integer, db.ForeignKey('requisition_schedule.id'), nullable=True)



class RequisitionSchedule(db.Model):
    __tablename__ = 'requisition_schedule'
    id = db.Column(db.Integer, primary_key=True)
    schedule_day_and_time = db.relationship('ScheduleDayAndTime', backref='requisition_schedule', lazy=True)
    # ...
    # ...

如何更新多个表上的数据..?

现在尝试这样:

requisition_schedule = RequisitionSchedule.query.filter_by(id=requisition_schedule_id).first()

requisition_schedule.schedule_day_and_time.clear()
db.session.commit()

schedule_day_and_time_1 = ScheduleDayAndTime(
    day=form.schedule_day.data,
    start_at=form.start_at.data,
    end_at=form.end_at.data,
)

schedule_day_and_time_2 = ScheduleDayAndTime(
    day=form.schedule_day_2.data,
    start_at=form.start_at_2.data,
    end_at=form.end_at_2.data,
)

requisition_schedule.schedule_day_and_time.append(schedule_day_and_time_1)
requisition_schedule.schedule_day_and_time.append(schedule_day_and_time_2)
db.session.commit()

我首先清除数据,然后附加新数据。 但我认为这不是最佳实践,因为我的表上仍然有旧记录,它只是删除相关的ForeignKey id,但相关列上仍然有其他记录。

那么,如何以正确的方式做到这一点......?

最佳答案

我通过执行以下操作来解决这个问题:

首先,我删除当前记录:

ScheduleDayAndTime.query.filter(ScheduleDayAndTime.requisition_schedule_id==requisition_schedule_id).delete()
db.session.commit()

然后我像上面的问题一样附加它:

schedule_day_and_time_1 = ScheduleDayAndTime(
    day=form.schedule_day.data,
    start_at=form.start_at.data,
    end_at=form.end_at.data,
)

schedule_day_and_time_2 = ScheduleDayAndTime(
    day=form.schedule_day_2.data,
    start_at=form.start_at_2.data,
    end_at=form.end_at_2.data,
)

requisition_schedule.schedule_day_and_time.append(schedule_day_and_time_1)
requisition_schedule.schedule_day_and_time.append(schedule_day_and_time_2)
db.session.commit()

不知道这是否是最佳实践,但我认为这比我上面问题的解决方案更好。

关于python - Flask-SQLAlchemy 更新一对多记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58108205/

相关文章:

flask - 属性错误: '_Option' object has no attribute '_sa_instance_state' in flask

oracle - 在 SQLAlchemy 中使用 Oracle 服务名称

javascript - ajax重定向时浏览器出错

python - 将字符串列表表示为其 ascii 代码的 numpy 数组

python - 使用 NaturalDocs 记录 Python

python - 使用 flask 的 socketio 扩展从线程发出

python - SQLAlchemy 中需要多少个 Base 或 MetaData 实例?

python - SQLAlchemy 0.7 MapperEvent 错误

python - Flask/SQLAlchemy : Incompatible collection type: None is not list-like

python - 如何创建一个字典,将点添加到文本文件中的名称?