我已经使用此字段创建模型:
field_1 , field_2, field_3, ... , field_n
我想要filter
这 k 个字段的所有对象:
field_1 , field_2, .... , field_k
这些对象中的 n 不是Null
.
我的错误答案:
我确实认为我必须创建要在查询中设置的字段列表:
my_list = [`field_1` , `field_2`, .... , `field_k`]
并像这样创建我的查询:
my_objects = Class.objects.filter([ (eval(field_name +"__isnull = False") ) for field_name in my_list ])
但这是错误的。我怎样才能做到这一点?
你把事情搞得太复杂了,你不能用字符串构造一个列表并将其传递给filter(..)
希望它能起作用。此外eval(..)
事实并非如此,即使这样做,也会导致严重的安全风险。eval(..)
and exec(..)
应尽可能避免,因为从有人设法将字符串“注入”到其中的那一刻起,他们就可以在您的服务器上运行任意代码,从而尝试“转储数据库”等。参见这个答案 https://stackoverflow.com/questions/1832940/why-is-using-eval-a-bad-practice更深入地分析原因“评估是不好的做法".
您可以构造一个字段名称列表(即字符串):
my_list = ['field_1', 'field_2', 'field_k']
然后我们可以构造一个字典并执行字典解包,例如:
Class.objects.filter(**{'{}__isnull'.format(f): False for f in my_list})
两个星号(**
),因此将进行函数调用,使得f(**{'a': 4, 'b': 2})
, 是相同的f(a=4, b=2)
,因此在这里它将进行类似的调用.filter(field_1__isnull=False, field_2__isnull=False, field_k__isnull=False)
.
或者自从python-3.6 /questions/tagged/python-3.6,我们可以利用F 弦:
Class.objects.filter(**{f'{f}__isnull': False for f in my_list})
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)