如何将字典参数解包传入Django ORM的filter方法筛选模型数据
正确实现方式
你之前的代码存在两个核心问题:
- Django ORM的筛选方法拼写错误,正确方法名是
filter()而非filters() - 字典需要用
**解包运算符转换为关键字参数后,才能传入filter()方法
实现方案1:接收字典参数
适合筛选条件已经提前封装为字典的场景:
def find_player(filter_params: dict): # 用**解包字典后传入filter方法 players = Player.objects.filter(**filter_params).all() for player in players: # 你的业务逻辑 print(player.name)
调用示例:
# 注意字典的键必须是字符串,和模型字段名完全对应 find_player({"defender": True, "goalkeeper": True}) find_player({"defender": True, "attacker": False}) find_player({"defender": False})
实现方案2:直接接收关键字参数(更简洁)
适合调用时手动传筛选条件的场景,不需要额外封装字典:
def find_player(**kwargs): players = Player.objects.filter(**kwargs).all() for player in players: print(player.name) # 调用时直接传筛选条件即可 find_player(defender=True, goalkeeper=True) find_player(defender=True, attacker=False) find_player(defender=False)
注意事项
- 字典的键必须与模型字段名完全匹配,拼写错误会触发字段不存在的异常
- 支持Django原生的双下划线查询语法,比如传入
{"name__icontains": "Ronaldo"}即可实现名字的模糊匹配 - 不要使用
exec()实现该需求,该写法存在极高的SQL注入风险,且完全不符合Django的设计规范
内容的提问来源于stack exchange,提问作者justajolt
相关产品推荐
相关产品推荐

