Flask-SQLAlchemy обновляет запись один-ко-многим - PullRequest
1 голос
/ 26 сентября 2019

У меня есть модели отношений один-ко-многим, и вот фрагмент моих моделей:

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()

Я clear сначала данные, а затем append новые данные.Но я думаю, что это не лучшая практика, так как у меня все еще есть старая запись в моей таблице, она просто удаляет связанный идентификатор ForeignKey, но все еще имеет другие записи в связанном столбце.

Итак, как это сделать вправильный путь ..?

1 Ответ

0 голосов
/ 26 сентября 2019

Я выясняю это, выполнив следующее:

Сначала я удаляю текущую запись:

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()

Не знаю, является ли это лучшей практикой или нет, но я думаю, что это лучше, чем решение по моему вопросу выше.

...