python - 如何删除具有指定角色的所有用户
问题描述
这些是我的用户和角色模型:
class User(db.Model, UserMixin):
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
firstname = db.Column(db.String(100), nullable=False, server_default='')
lastname = db.Column(db.String(100), nullable=False, server_default='')
username = db.Column(db.String(80), unique=True, nullable=False)
email = db.Column(db.String(80), unique=True, nullable=False)
password = db.Column(db.String(200), nullable=False)
answers = db.relationship('Answer', backref="examinee", lazy=True)
date_created = db.Column(db.DateTime, default=datetime.utcnow)
active = db.Column('is_active', db.Boolean(), nullable=False, server_default='0')
roles = db.relationship('Role', secondary='user_roles', backref=db.backref('users', lazy='dynamic'))
class Role(db.Model, RoleMixin):
id = db.Column(db.Integer(), primary_key=True, autoincrement=True)
name = db.Column(db.String(50), unique=True)
description = db.Column(db.String(255))
class UserRoles(db.Model):
id = db.Column(db.Integer(), primary_key=True, autoincrement=True)
user_id = db.Column(db.Integer(), db.ForeignKey('user.id', ondelete='CASCADE'))
role_id = db.Column(db.Integer(), db.ForeignKey('role.id', ondelete='CASCADE'))
UniqueConstraint('user_id', 'role_id', name='user_role_uniqueness')
如何删除具有特定角色(例如“学生”)的所有用户?
我尝试了以下无效的代码段:
@app.route('/removeAllStudentUsers', methods=['GET', 'POST'])
def remove_all_student_users():
default_role_name = "student"
default_role = Role.query.filter(Role.name == default_role_name).first()
User.query.filter().delete(and_(User.roles.contains(default_role), func.count(User.roles) == 1)) # this line causes the error
db.session.commit()
return redirect(url_for('users'))
上面的代码会导致这个错误:
sqlalchemy.exc.ArgumentError:会话同步的有效策略是“评估”、“获取”、“假”
解决方案
您尝试实现这一目标存在多个问题,包括您可能需要 group by 以检查角色计数的事实。
我将执行以下操作:
_ = (
User.query
.filter(User.roles.any(Role.name == default_role_name)) # 1
.filter(~User.roles.any(Role.name != default_role_name)) # 2
.delete(synchronize_session=False) # 3
)
在哪里:
- 确保只返回
User
具有给定角色的人 - 确保排除
User
还有其他角色的人(这是您尝试解决的问题func.count
) - 这是您遇到的错误的解决方案。
推荐阅读
- jquery - 收到错误 net::ERR_CERT_AUTHORITY_INVALID
- reactjs - RTK 查询重置
- jenkins - Jenkins 默认负载平衡行为
- python - Bot 不会回应 Emoji Reaction
- javascript - Snowpack 3.8 找不到源文件夹,以不同的根目录运行开发服务器
- c# - C# 如何获取下载文件名 - Selenium(chrome)
- javascript - 根据下拉列表中选择的值动态设置单选按钮组的标签
- json - Helm Yaml 中的嵌套数组
- java - 如何将包含逻辑语句的字符串转换为 Java 中的布尔值
- java - 我正在尝试编写一个程序,该程序将密码保护用户的 pdf。用户需要能够上传 pdf 并下载受保护的