【问题标题】:Filter Django Models using lists of field parameters使用字段参数列表过滤 Django 模型
【发布时间】: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


【解决方案1】:

你应该解包函数中的字典,所以**kwargs而不是kwargs

#               ↓ no double asterisk
def find_player(kwargs):
    #                                ↓↓ double asterisk
    players = Player.objects.filters(**kwargs).all()
    # …

然后您可以通过传递字典来使用它:

find_player({defender:True, goalkeeper:True})
find_player({defender:True, attacker:False})
find_player({defender:False})

【讨论】:

  • 非常感谢。这正是我没有得到的。
猜你喜欢
  • 2018-09-30
  • 1970-01-01
  • 2020-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-19
  • 2011-10-25
  • 2021-02-10
相关资源
最近更新 更多