繁体   English   中英

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

[英]Check is_null for list of field in Django queryset filtering

我已经使用以下字段创建了 model:

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(..)应该尽可能避免,因为从有人设法“注入”一个字符串的那一刻起,他们就可以在你的服务器上运行任意代码,从而尝试“转储”数据库”等。有关为什么“评估是不好的做法”的更深入分析,请参阅此答案

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

my_list = ['field_1', 'field_2', 'field_k']

然后我们可以构造一个字典并执行字典解包,例如:

Class.objects.filter(**{'{}__isnull'.format(f): False for f in my_list})

因此,两个星号 ( ** ) 将进行 function 调用,使得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(**{f'{f}__isnull': False for f in my_list})

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM