2017-02-21 3 views
-1

フラスコの新機能で、Flaskビューでさまざまなユーザーイベントに基づいてモデルを更新しようとしています。私はシェルでそれにアクセスすることができ、そこに格納されたデータでいくつかのフィールドをプルアップすることができます。しかし、特定のユーザーイベントに基づいてビューからモデルを更新する必要があります。以下は私のモデルファイルです:Flaskのデータベースモデルをビュー内の関数で更新する

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

    id = db.Column(db.Integer, primary_key=True, autoincrement=True) 
    student_id = db.Column(db.Integer, ForeignKey('student_profile.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, id, 

     stripe_id, 
     student_email, 
     subscription_date, 
     expiry_date, 
     is_active, 
     planname, 
     package_price, 
     coupon): 
      self.id = id 
      self.student_id = student_id 
      self.student_email = student_email 
      self.subscription_date = subscription_date 
      self.expiry_date = expiry_date 
      self.is_active = is_active 
      self.planname = planname 
      self.package_price = package_price 
      self.coupon = coupon 

のようなビューでこれらを更新する方法:フラスコは、多くのフォームの風味を持っているので、それはなぜ混乱しますので、私は、データベーステーブルを直接操作する必要が

from models import Package 
@app.route('/somelink', methods=['POST']) 
def somefunc(): 
    if studentdidsomething: 
     planname = 'somename' 
     db.session.commit(planname) 


return render_template('sometemplate.html') 

。 Wtfフォーム、Alchemyforms、フォームのみ。お知らせ下さい。

答えて

0

データセットが存在しない場合でも、データセットを表すモデルのインスタンスを作成する必要がある場合は、ユーザーイベントに応じてプロパティを設定し、インスタンスをセッションに追加します。既存のデータセットが既にある場合は、データベースからクエリを呼び出して、必要な値を更新する必要があります。

from models import Package 


@app.route('/somelink/<package_id>', default={'package_id': None}, methods=['POST']) 
def somefunc(package_id): 
    if package_id is None: 
     package = Package() 
    else: 
     package = Package.query(Package.id=package_id).first_or_404() 

    if studentdidsomething: 
     package.planname = 'somename' 
     db.session.add(package) 
     db.session.commit() 


    return render_template('sometemplate.html') 

ここでは、somelinkをpackage_idの有無にかかわらず呼び出すことができます。あなたが新しいパッケージなしで電話すると、作成されます。それ以外の場合は、既存のパッケージが使用されます。

+0

すべてのモデルフィールドの詳細を作成/変更するには参照が1つ必要です。また、最後の2つの文章はあなたの投稿の私を混乱させる。 @ app.routeでpackage_idを呼び出すと、既存のパッケージが作成されますか?ログインした現在のユーザーの変更を決定する最後の質問ですか? –

+0

'/ somelink/12'へのポストリクエストを行うと、12番のパッケージが変更されます。'/somelink/'というurlへのポストリクエストをすると(パッケージIDを渡さないと)、新しいパッケージが作成されます。 – MrLeeh

関連する問題