【发布时间】:2021-11-09 16:35:06
【问题描述】:
我希望能够将任意数量的字段和值传递到函数中以识别相关行:
models.py
class Player(models.Model):
name = CharField(max_length = 50, default = 'Ronaldo')
defender = BooleanField(default = False)
midfielder = BooleanField(default = False)
attacker = BooleanField(default = False)
goalkeeper = BooleanField(default = False)
views.py
def find_player(**kwargs):#to be used in some view
players = Player.objects.filters(kwargs).all()
for player in players:
#do something with player...
find_player({defender:True, goalkeeper:True})#selects rows with players who defend and play in goal
find_player({defender:True, attacker:False})#...
find_player({defender:False})
我在上面尝试做的显然行不通!我知道我也可以使用 exec() 来获得我想要的:
def find_player(string_of_params):
players = exec(Player.objects.filters(string_of_params).all())
for player in players:
print(player)
find_player('defender=True, goalkeeper=True')#prints rows with players who can defend and go in goal
find_player('defender=True, attacker=False')#...
find_player('defender=False'})
但我认为必须有一种更自然的方式将字典的内容直接解压缩到filter()。
欢迎对此提供任何指导。
【问题讨论】:
-
使用 ** 将字典解压缩为关键字参数:
players = Player.objects.filter(** kwargs)
标签: django filter model keyword-argument