2017-02-25 1 views
0

Ich bekomme Fehler beim Hinzufügen von Daten zu der Tabelle aus einer Ansicht in Flask. Die Tabelle, die ich aktualisieren möchte, hat eine ForeignKey-Beziehung zu einem anderen Modell. Ich versuche jedoch, das Kindmodell zu aktualisieren. Im Anschluss ist ein einfacher Fall:Flask Fehler TypeError: Inkompatible Sammlungsart: Str ist nicht list-like

Modelle:

Eltern Modell

class Student(db.Model): 
    __tablename__='student' 
    .... 
    package = package = relationship('Package', backref=backref('student')) 
    .... 
    def __init__(self, **kwargs): 
     for key, value in kwargs.items(): 
      setattr(self, key, value) 

Child Modell

class Package(db.Model): 
    __tablename__ = 'package' 

    id = db.Column(db.Integer, primary_key=True, autoincrement=True) 
    student_id = db.Column(db.Integer, ForeignKey('student.id')) 
    stripe_id = db.Column(db.String(45)) 
    student_email = db.Column(db.String(20)) 
    subscription_date = db.Column(db.DateTime, default=today) 
    expiry_date = db.Column(db.DateTime, default=deadline) 
    is_active = db.Column(db.Boolean, default=True) 
    planname = relationship('Plan', backref=backref('package')) 
    package_price = db.Column(db.Integer) 
    coupon = db.Column(db.String(12)) 

    def __init__(self, **kwargs): 
     for key, value in kwargs.items(): 
      setattr(self, key, value) 

Meine Ansicht:

@app.route('/yearlychargedrec', methods=['GET', 'POST']) 
def yearly_charged_rec(): 

    if not user_authorized(): 
     return redirect('/') 
    # customer 
    stripe_token = request.form['stripeToken'] 
    email = request.form['stripeEmail'] 

    customer = stripe.Customer.create(
     email=email, 
     source=request.form['stripeToken'] 
    ) 
    try: 
     subscription = stripe.Subscription.create(
      customer=customer.id, 
      plan="yearlyrec", 
     ) 

    except stripe.error.CardError as e: 
     # The card has been declined 
     body = e.json_body 
     err = body['error'] 
    if request.method == 'POST': 
     # email = email 

     package = Package(

      is_active=True, 
      planname = 'yearlyrec', 

     ) 
     db.session.add(package) 
     db.session.commit() 

    return render_template('/profile/charge/monthlycharge.html') 

Fehler:

TypeError: Incompatible collection type: str is not list-like 

Antwort

1

Paket und Plan-Modell haben eine Beziehung, so die unterhalb der Linie

planname = relationship('Plan', backref=backref('package')) 

Sie in Paketmodell haben ein Attribut package Modell Plan mit dem Namen hinzufügt und dieses Attribut Verweis auf ein Paket nicht an die Planen Sie, dass Sie ein solches Paketobjekt nicht erstellen können.

Die Lösung ist, sollte dieselbe Beziehung zum Plan Modell haben wir sagen Sie Ihren Plan Klasse so etwas wie dieses hat:

planname= relationship('Package', backref=backref('plan')) 

Jetzt können Sie ein Package-Objekt erstellen, wie folgt:

plan = Plan(name='yearlyrec') 
package = Package(is_active=True, plan=plan) 

Natürlich In diesem Szenario können Sie ein vorhandenes Plan-Objekt abfragen und verwenden.

+0

Ich werde das versuchen und wird die Antwort ankreuzen, wenn es funktioniert hat. Lass es mich wissen, wenn ich dieses Commit oben stelle, außer: Block wäre vernünftig, es dort zu platzieren? Also, wenn es eine Ausnahme gibt, wird das Modell nicht gespeichert? –

+0

Fügen Sie eine Beziehungslinie zur Plan-Klasse hinzu. Ersetzen Sie die Objekterstellung durch Ihre (wenn request.method ...) – metmirr

+0

Es gibt mir kein Datenbankproblem, aber es sagt "AttributeError: 'str' Objekt hat kein Attribut 'Sitzung'". Problem im Zusammenhang mit diesem Beitrag ist gelöst, so werde ich eine andere Frage eröffnen. Danke für die Hilfe. –

Verwandte Themen