通过传递字符串键,值对来执行动态django ORM过滤器



我想在django ORM中执行以下操作:

field = 'name'
value = 'patrick'
Asset.objects.filter(field=value)

在一次性的基础上,我可以做:

a = Asset()
a.setattr(field, name)
a.save()

但这对我的目的来说太长了。

是否可以使用object,因为我有大约 50k 个项目要根据用户提供的枚举字段/值进行更新。

另一种说法是如何模拟这种模式,或者我必须为此编写原始 sql,即"SELECT * FROM asset WHERE %s='%s' % (field, value)(注意我现在表达式倾向于 SQL 注入,但这很好 - 这是受信任(枚举(的输入值(。

>>> Asset.objects.filter('name'='patrick')
File "<console>", line 1
SyntaxError: keyword can't be an expression

关键字参数可以在您的情况下使用。

  • 关键字参数:在函数调用中以标识符(例如 name=(开头的参数,或在字典中作为值以 ** 开头传递的参数。例如,3 和 5 都是以下对 complex(( 的调用中的关键字参数:
complex(real=3, imag=5)
complex(**{'real': 3, 'imag': 5})

在您的情况下,它将如下所示。

key = input()
value = input()
kwargs = {
'{0}'.format(key): '{0}'.format(value),
}
Asset.objects.filter(**kwargs)

您也可以添加 for 循环等,无论这回答了您的问题,希望这可以解决您的问题。

最新更新