【问题标题】:Updating database model in Flask with functions in views使用视图中的函数更新 Flask 中的数据库模型
【发布时间】:2017-02-21 05:10:50
【问题描述】:

我是 Flask 的新手,我正在尝试根据我的 Flask 视图中的不同用户事件更新模型。我可以在 shell 中访问它,并且可以提取一些存储在其中的数据的字段。但是我需要根据某些用户事件从视图中更新模型。以下是我的模型文件:

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和just形式。请指教。

【问题讨论】:

    标签: python flask flask-sqlalchemy


    【解决方案1】:

    如果您的数据集不存在,但您需要创建一个代表数据集的模型实例,根据您的用户事件设置属性并将该实例添加到您的会话中。如果您已经有一个现有的数据集,您需要从数据库中查询它并更新您想要的值。

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

    在这里,您可以调用带有或不带有 package_id 的 somelink。如果你调用没有一个新的包将被创建。否则将使用现有的包。

    【讨论】:

    • 所以我只需要一个参考来创建/更改所有模型字段的详细信息?最后两句话也让我对你的帖子感到困惑。你的意思是如果我在 @app.route 中调用 package_id 那么现有的包会被创建吗?最后一个问题是它会决定当前登录用户的变化吗?
    • 如果您向 url /somelink/12 发出 post 请求,您将更改 id 为 12 的包。如果您向 url /somelink/ 发出 post 请求(您没有传递包 id),那么将创建一个新包。
    猜你喜欢
    • 2012-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多