检查 is_null 以获取 Django 查询集过滤中的字段列表
Check is_null for list of field in Django queryset filtering
我已经用这些字段创建了模型:
field_1 , field_2, field_3, ... , field_n
我想 filter
这些 k 字段的所有对象:
field_1 , field_2, .... , field_k
这些对象中没有 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(..)
和 exec(..)
应该尽可能避免,因为从有人设法 "inject" 一个字符串到它的那一刻起,他们就可以 运行 在你的服务器上任意代码,并且因此尝试 "dump the database",等等。请参阅 this answer 以更深入地分析为什么“Eval 是不好的做法”。
您可以构建字段名称列表(字符串):
my_list = ['field_1', 'field_2', 'field_k']
然后我们可以构造字典,进行字典拆包,如:
Class.objects.filter(<b>**{</b>'{}__isnull'.format(f): False for f in my_list<b>})</b>
两个星号 (**
) 将因此进行函数调用,使得 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 以来,我们可以利用 f-strings:
Class.objects.filter(**{<b>f'{f}__isnull'</b>: False for f in my_list})
我已经用这些字段创建了模型:
field_1 , field_2, field_3, ... , field_n
我想 filter
这些 k 字段的所有对象:
field_1 , field_2, .... , field_k
这些对象中没有 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(..)
和 exec(..)
应该尽可能避免,因为从有人设法 "inject" 一个字符串到它的那一刻起,他们就可以 运行 在你的服务器上任意代码,并且因此尝试 "dump the database",等等。请参阅 this answer 以更深入地分析为什么“Eval 是不好的做法”。
您可以构建字段名称列表(字符串):
my_list = ['field_1', 'field_2', 'field_k']
然后我们可以构造字典,进行字典拆包,如:
Class.objects.filter(<b>**{</b>'{}__isnull'.format(f): False for f in my_list<b>})</b>
两个星号 (**
) 将因此进行函数调用,使得 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 以来,我们可以利用 f-strings:
Class.objects.filter(**{<b>f'{f}__isnull'</b>: False for f in my_list})