2012-07-02 8 views
14

Meine Anwendung verwendet eine Kombination aus Flask, Flask-SQLAlchemy, Flask-WTF und Jinja2.Flask-SQLAlchemy: Wie Sie eine Zeile bedingt einfügen oder aktualisieren

In seiner aktuellen Inkarnation habe ich eine Einstellungstabelle. Die Tabelle enthält nur einen Datensatz mit einem Feld. Anfangs enthält die Tabelle null Datensätze.

Was ich will, erreichen ist:

  • Da keine Einträge in db vorhanden sind, dann zeigen leere Form bereit für Benutzereingaben
  • Da ein Eintrag vorhanden ist, zeigen Sie den Eintrag, und
  • Wenn der Benutzer den Wert ändert, aktualisieren Sie den rec in db.

Hier ist mein Code:

models.py

class Provider(db.Model): 
    id = db.Column(db.Integer, primary_key = True) 
    rssfeed = db.Column(db.String(120), unique = True) 

    def __init__(self, rssfeed): 
     self.rssfeed = rssfeed 

    def __repr__(self): 
     return '<NZBMatrix feed url %r>' % self.rssfeed 

forms.py

class SettingsForm(Form): 
    rssfeed = TextField('rssfed', validators= [Required()]) 

views.py

So wie es aussieht, erstellt dieser Code einen Datensatz, wenn er nicht existiert, aber die Spalte rssfeed leer ist.

Wie kann ich diesen Code ändern, so dass es INSERT ist, wenn der Datensatz nicht existiert und UPDATE wenn es tut?

+1

Nur FYI - 'form.validate' sollte' form.validate() 'sein - eine Funktion ist immer truthy, aber Ihre Form * kann * Validierung nicht bestehen. –

+0

Danke, dass du das unterstrichen hast! – happygoat

Antwort

28

Sobald Ihre Form usw., validiert

einen neuen Datensatz hinzufügen:

new_provider = Provider(form.rssfeed.data) 
db.session.add(new_provider) 
db.session.commit() 

einen vorhandenen Datensatz zu aktualisieren:

existing_provider = Provider.query.get(1) # or whatever 
# update the rssfeed column 
existing_provider.rssfeed = form.rssfeed.data 
db.session.commit() 

Der Trick bei der Aktualisierung ist, dass Sie nur das bestimmte Feld ändern und eine Festschreibung durchführen müssen. Der Rest wird von der db-Sitzung übernommen. Ich denke, dass Sie die Zusammenführungsfunktion verwenden, die jetzt in SQLAlchemy veraltet ist.

4

Ich habe es geschafft, das Problem zu tun, diese Änderungen an der view.py Datei zu lösen:

@app.route('/settings', methods=["GET","POST"]) 
def settings(): 
    """ show settings """ 
    provider = Provider.query.get(1) 
    form = SettingsForm(request.form,obj=provider) 

    if request.method == "POST" and form.validate(): 
     if provider: 
      provider.rssfeed = form.rssfeed.data 
      db.session.merge(provider) 
      db.session.commit() 
      flash("Settings changed") 
      return redirect(url_for("index")) 
     else: 
      provider = Provider(form.rssfeed.data) 
      db.session.add(provider) 
      db.session.commit() 
      flash("Settings added") 
      return redirect(url_for("index")) 
    return render_template("settings.html", form=form)