Flask/SQLAlchemy Attribut hinzufügen nicht möglich

Django, Flask, Bottle, WSGI, CGI…
Antworten
Hase
User
Beiträge: 100
Registriert: Donnerstag 1. Oktober 2009, 15:17
Wohnort: Bremer Speckgürtel

Hallo, habe nun begonnen, mein 10 Jahre altes TG-Programm auf Flask/SQLAlchemy/Python3 zu aktualisieren. Klappt überraschend gut. Aber hier komme ich nicht weiter:

Ich habe eine Datenbank mit einer 1:n Beziehung (main=1, positionen=n). Aus den Werten der Datenbank werden dann noch weitere Werte berechnet. Diese sollen dann mit im Template angezeigt werden. Dafür nehme ich die Werte, mache die Berechnung und füge der Klasse ein weiteres Attribut mit dem Ergebnis hinzu.
Hier ein Minimalbeispiel:

Code: Alles auswählen

@bp.route('/index',methods=('GET','POST'))
def index():
    if request.method == 'POST':
        verweis = request.form['verweis']

    main=models.mtab.query.filter_by(verweis=verweis).one()   # SQLAlchemy db.Model 
    positionen=main.positionen                         # das ist die 1:n relationship 
  
    #Attribut mit neu berechnetem Wert hinzufügen
    
    for position in positionen:
        position.wert="Berechneter Wert" 
    
    return render_template('/test.html',titel="test", positionen=positionen) 
So hat es unter TG1/SQLAlchemy0.6 funktioniert. Das klappt nun nicht mehr. Das Attribut position.wert gibt es nach Durchlauf der for-Schleife nur im letzten von n Datensätzen. Warum, was ist hier los? Ist das ein neues Feature von Python3 oder hat das mit SQLAlchemy zu tun? Keine Fehlermeldung, Programm läuft durch.

Programmversionen: jeweils die Aktuellen unter Ubuntu Xenial

Grüße Ingo
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Die Datensätze aus positionen werden `lazy` erzeugt und da Du keine Referenz darauf speicherst, wird das Objekt auch gleich wieder freigegeben. Du mußt Dir eine Referenz aller Positionen in einer Liste merken:

Code: Alles auswählen

positionen = list(main.positionen)
Hase
User
Beiträge: 100
Registriert: Donnerstag 1. Oktober 2009, 15:17
Wohnort: Bremer Speckgürtel

Wow, danke!

Mir war das lazy='dynamic' zwar aufgefallen, ich hatte dem aber keine weitere Bedeutung zugemessen. Hab es auf lazy='select' geändert, das geht auch.
Antworten