У меня есть приложение фляги, где клиенты постоянно вносят изменения в объект в модели в БД. Затем, когда клиент явно отправляет запрос «Сохранить», новое состояние объекта должно быть сохранено в БД. Если клиент не отправил запрос «Сохранить», я бы хотел, чтобы все изменения полей были отброшены, а состояние объекта было возвращено в исходное состояние перед изменениями, чтобы следующая загрузка объекта находилась в исходном состоянии.
Проблема в том, что мне нужно сохранять даже несохраненные изменения объекта в БД, чтобы обеспечить контекст сеанса для следующего запроса от клиента. Для будущих запросов в сеансе необходимо самое последнее состояние объекта. Но при таком подходе я фактически полностью теряю исходное состояние объекта.
Некоторые примеры ниже
#models.py - saves an object in the dashboard field
class Dash(db.Model):
id = db.Column(db.INTEGER, primary_key=True)
name = db.Column(db.String(20), nullable=False)
dashboard = db.Column(db.PickleType(),nullable=True)
И в моих маршрутах у меня есть следующий метод, который обновляетопределенный атрибут в объекте:
#routes.py
class setInputAPI(Resource):
def post(self):
dash = getdash() #gets latest DB object
dash.value = request.json['new_val'] #changes an object attribute
updateDB(dash) #update db with new object so future requests have context
return {'message':'success'}
#Helper functions
def getdash():
dash_id = request.json['dash_id']
dash = Dash.query.get_or_404(dash_id).dashboard
return dash
def updateDB(dash):
dash_id = request.json['dash_id']
db.session.query(Dash).filter(Dash.id == dash_id).update({'dashboard': dash})
db.session.commit()
При отправке вышеуказанного запроса setInputAPI
состояние моей БД будет обновлено, чтобы отразить изменения клиента, даже если клиент не отправил запрос на сохранение. Поэтому я потерял всеисходные данные, и если бы клиент перезагрузил этот объект в будущем сеансе, он увидел бы свой измененный экземпляр объектаНапример, последний сохраненный.
Потенциальным решением может быть создание дублированной таблицы, которая просто отслеживает последнее сохраненное состояние объекта и загружает его.
Таким образом, я мог бы иметь 2 таблицы - одну для отслеживания состояния last_saved
и другую для отслеживания состояния current_unsaved
.
Но я должен представить, что должен быть лучший способ сделать это какэто кажется вздорным?