Flask用户活动追踪:记录用户创建关系的User模型修改咨询
实现用户创建关系追踪方案
1. 调整User模型,新增自引用外键关联
你只需要给User表加一个自引用的外键,实现创建者和被创建用户的一对多关联,修改后的完整模型代码如下:
class User(db.Model): __tablename__ = "usersTable" id = db.Column(db.Integer, primary_key=True, autoincrement=True) username = db.Column(db.String(128), nullable=False) password = db.Column(db.String(255), nullable=False) active = db.Column(db.Boolean(), default=True, nullable=False) created_date = db.Column(db.DateTime, default=func.now(), nullable=False) # 新增字段:记录创建该用户的用户ID created_by_id = db.Column(db.Integer, db.ForeignKey('usersTable.id'), nullable=True) # 新增关联:获取当前用户创建的所有用户,反向引用可以直接通过.creator获取创建者 created_users = db.relationship( 'User', backref=db.backref('creator', remote_side=[id]), lazy='dynamic' )
注意
created_by_id设置为可空,是为了兼容初始的超级管理员账号(没有上级创建者)。
2. 修改后端用户创建接口逻辑
你的前端代码已经在请求时携带了认证Token,不需要修改任何前端代码,只需要在后端创建用户的接口中,从Token解析出当前登录的用户ID,赋值给新用户的created_by_id字段即可。
以Flask-JWT-Extended扩展为例,核心逻辑参考:
from flask_jwt_extended import jwt_required, get_jwt_identity # 你的创建用户接口路由 @api.route('/users', methods=['POST']) @jwt_required() def create_user(): # 原有参数校验、密码加密逻辑保持不变 # 从JWT中获取当前登录的用户ID,即创建者ID current_user_id = get_jwt_identity() # 新建用户时赋值创建者ID new_user = User( username=request.json['username'], password=your_password_hash_func(request.json['password']), created_by_id=current_user_id ) db.session.add(new_user) db.session.commit() # 原有返回逻辑保持不变
3. 常用操作示例
# 获取ID为3的用户创建的所有账号 user = User.query.get(3) created_user_list = user.created_users.all() # 获取ID为5的用户的创建者信息 user = User.query.get(5) creator_info = user.creator # 统计每个用户创建的账号数量(直接用SQL查询,性能远高于pickle方案) from sqlalchemy import func create_count = db.session.query( User.created_by_id, func.count(User.id) ).group_by(User.created_by_id).all()
方案优势
相比pickle字段方案,该方案有明显优势:
- 数据结构化存储,所有关联查询、统计都可以直接通过SQL完成,不需要反序列化全量数据
- 没有pickle的版本兼容性、安全风险问题
- 关联关系由数据库外键约束维护,数据一致性更高
- 操作逻辑简单,无需额外处理序列化、反序列化逻辑
内容的提问来源于stack exchange,提问作者Angela Rubchinksy
相关产品推荐
相关产品推荐

