检查 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).

或者自 以来,我们可以利用 f-strings:

Class.objects.filter(**{<b>f'{f}__isnull'</b>: False for f in my_list})