Chcę zmienić atrybut obiektu, zanim zostanie wstawiony do bazy danych przy użyciu Falsk-SQLAlachemy. Próbowałem za pomocą before_models_committed sygnał, ale wydaje się być uszkodzony, więc staram models_commited zamiast (i ponownego popełnienia zmian) i pojawia się następujący błąd:Zmiana atrybutu obiektu podczas zatwierdzania sesji - Flask SQLAlchemy
InvalidRequestError: This session is in 'committed' state; no further SQL can be emitted within this transaction.
Kod jest mowa poniżej:
from app import db
from app import app
from flask.ext.sqlalchemy import models_committed
class Foo(db.Model):
id = db.Column(db.Integer, primary_key=True)
foo_attr = db.Column(db.String(128), index=True)
def on_models_committed(app, changes):
for change in changes:
foo_obj = change[0]
operation = change[1]
if foo_obj.__class__.__name__ == 'Foo':
if operation == 'insert':
foo_obj.foo_attr = get_new_value()
db.session.add(foo_obj)
db.session.commit()
models_committed.connect(on_models_committed)
Czy istnieje sposób łączenia dowolnych sygnałów w celu wykonania funkcji za każdym razem, gdy nowy obiekt zostanie wstawiony do bazy danych i zapisać te zmiany?
Dzięki!
że istnieje ważna różnica tutaj. 'before_insert' dzieje się w innym momencie sesji niż' models_committed'. [Źródło] (https://pythonhosted.org/Flask-SQLAlchemy/signals.html#models_committed) –