如何将变量值作为参数名传入使用*kwargs的filter_by方法?
解决方法:用字典解包动态生成关键字参数
你遇到的问题本质是Python中如何用变量的值作为关键字参数的名称。直接写attr=xxx时,Python会把attr当作参数名本身,而不是它存储的字符串值(比如"username"),所以才会报错说User没有attr属性。
解决这个问题很简单,只需要先构建一个字典,把变量attr的值作为键,对应的属性值作为值,然后用**操作符把字典解包成关键字参数传给filter_by:
user = User(username="User", password="Password") attr = "username" # 构建字典并解包 session.execute(select(User).filter_by(**{attr: getattr(user, attr)})).scalar_one()
当你把attr改成"password"时,字典就会变成{"password": "Password"},解包后filter_by就会接收到password="Password"这个参数,完全符合你的需求。
如果需要同时传入多个动态参数,也可以扩展这个字典:
attrs = ["username", "password"] filter_kwargs = {key: getattr(user, key) for key in attrs} session.execute(select(User).filter_by(**filter_kwargs)).scalar_one()
内容的提问来源于stack exchange,提问作者Connor12858
相关产品推荐
相关产品推荐

