我第一次在Flask上开发Web应用程序后端。我正在从数据库中使用SQLAlchemy。我有一个简单的用户类,除了updated_at DateTime字段外,大多数情况下都可以正常工作。看起来是这样的:
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
password = db.Column(db.String(50))
email = db.Column(db.String(120), unique=True)
created_at = db.Column(db.DateTime, server_default=db.func.now())
updated_at = db.Column(db.DateTime, server_default=db.func.now(), server_onupdate=db.func.now())
我的@app.route('/users)
中有一个post方法,该方法可以按预期方式与在数据库中自动填充的update和created_at字段一起使用:
def post(self): #Creates a new user
new_user = User(
username=api.payload['username'],
password=api.payload['password'],
email=api.payload['email'],
)
db.session.add(new_user)
db.session.commit()
# user_schema.dump(new_user)
return {'message': 'New user {} was created'.format(api.payload['username'])}, 201
现在,这是我放置在为与单个用户相关的端点app.route(/users/<user_id>)
指定的路由上的put函数。根据要求,我希望在上述用户模型中利用server_onupdate=db.func.now()
属性。当我发出请求时,其他所有字段都正确更新了,这不会发生。
def put(self, user_id):
user = User.query.filter_by(id=user_id).first()
if not user:
return {'message': 'User does not exist'}
user.id = user.id
user.password = api.payload['password']
user.email = api.payload['email']
db.session.commit()
return {'message': 'User {} has been updated'.format(user.username)}
我可以向user.updated_at = datetime.datetime.now()
这样的User对象添加一行,但这看起来像是在作弊,并且我想利用SQLAlchemy字段属性。
让我知道您是否有任何想法,或者您是否可以了解我可能做错了什么。非常感谢!