2017-02-25 69 views
0

从Flask中的视图向表中添加数据时出现错误。我试图更新的表具有与另一个模型的ForeignKey关系。但是我正在尝试更新子模型。下面是一个简单的例子:Flask错误TypeError:不兼容的集合类型:str不是类似列表的

型号:

父模型

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) 

子模型

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) 

笔者认为:

@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') 

错误:

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

回答

1

包装和规划模式有关系,所以下面的线

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

您在封装模式有添加一个名为package到规划中的一个属性,这个属性是参考一篮子不给计划,以便您不能像创建一个包对象。

的解决方案是应该有规划模型相同的关系,让我们说你的计划类有这样的事情:

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

现在,您可以按如下创建一个包装对象:

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

当然您可以在此方案中查询和使用现有的Plan对象。

+0

我会试试这个,如果它能工作的话,会打勾。让我知道,如果我把这个提交上面,除了:块将它放在那里是合理的?那么如果有异常模式将不会被保存? –

+0

将关系线添加到计划类。用你的替换对象创建(如request.method ...) – metmirr

+0

它没有给我任何数据库问题,但它说“AttributeError:'str'对象没有属性'会话'”。与这篇文章相关的问题已解决,因此我将打开另一个问题。感谢帮助。 –