检查is_null以获取Django queryset过滤中的字段列表

我使用以下字段创建了模型:

field_1,field_2,field_3,...,field_n

我想filter包含以下k个字段的所有对象:

field_1,....,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 ])

但这是错误的。 我该怎么做?

yukuanli 回答:检查is_null以获取Django queryset过滤中的字段列表

您使事情变得过于复杂,无法使用字符串构造列表并将其传递给filter(..),以希望它可以正常工作。此外,eval(..)不能那样工作,即使这样做,也将导致严重的安全风险。应该尽量避免使用eval(..)exec(..),因为从某人设法向其中“注入”字符串的那一刻起,他们就可以在您的服务器上运行任意代码,从而尝试“转储数据库”等。有关“ 评估不正确的做法”的原因的详细分析,请参见this answer

您可以构造一个字段名称列表(即字符串):

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)相同,因此此处将进行类似于{{ 1}}。

或者从开始,我们可以使用 f字符串

.filter(field_1__isnull=False,field_2__isnull=False,field_k__isnull=False)
本文链接:https://www.f2er.com/3108318.html

大家都在问