Flask调用User模型时出现__init__缺4个必填参数如何解决
问题根因
你当前的逻辑存在两个核心错误:
- 你的
User数据库模型在定义时,要求实例化必须传入name、email、password、age四个必填字段,你在/profile接口中只传入post参数初始化User实例,不符合模型的参数要求,因此直接抛出参数缺失的报错。 - 逻辑设计错误:
User表是用来存储用户账号基础信息的,不适合用来存储用户发布的帖子内容,把用户信息和帖子信息存在同一张表会出现严重的数据冗余和逻辑混乱。
解决步骤
步骤1:新增独立的帖子表模型
你需要单独定义Post模型来存储用户发布的内容,和User表做关联,示例代码如下:
# 导入外键相关依赖 from sqlalchemy import ForeignKey from sqlalchemy.orm import relationship # 原有User模型不用改,新增Post模型 class Post(db.Model): id = db.Column(db.Integer, primary_key=True) # 关联对应用户的id,和User表做外键关联 user_id = db.Column(db.Integer, ForeignKey('user.id'), nullable=False) # 存储帖子内容 content = db.Column(db.String(1000), nullable=False) # 建立和User表的关联关系,方便后续查询某个用户发的所有帖子 user = relationship('User', backref=db.backref('posts', lazy=True))
注意:修改完模型后需要执行数据库迁移操作,让新的Post表生效。
步骤2:修改/profile接口的逻辑
首先你需要从登录态里拿到当前发起请求的用户信息,然后用Post表存储帖子内容,示例修改如下:
@app.route("/profile", methods=['POST', 'GET']) def post(): if request.method == 'POST': post_content = request.json.get('post', None) if not post_content: return "Write Something" # 从session里拿到当前登录用户的标识,和你之前存储session的键保持一致即可 current_username = session.get("2o1£21ıoj2£#31ı12k3130o210*321") if not current_username: return "Please login first" # 查询当前用户的完整信息 current_user = User.query.filter_by(name=current_username).first() # 实例化Post对象存储帖子 addPost = Post(user_id=current_user.id, content=post_content) db.session.add(addPost) db.session.commit() return "Posted" return "Posted"
如果你的项目用了JWT做身份校验,也可以从create_access_token生成的token里解析当前用户身份,替换掉从session取用户的逻辑即可。
临时解决方法(不推荐,仅做参考)
如果你确实非要把帖子存在User表(会导致数据逻辑完全混乱),需要先给User表的post字段设置允许为空,同时要先查询到当前登录的用户对象,直接修改该对象的post字段值,而不是新建一个User实例:
# 错误写法不要用:addPost = User(post=post) # 临时兼容写法 current_username = session.get("2o1£21ıoj2£#31ı12k3130o210*321") current_user = User.query.filter_by(name=current_username).first() current_user.post = post db.session.commit()
内容的提问来源于stack exchange,提问作者Rıdvan
相关产品推荐
相关产品推荐

