gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 01:47:11 25 4
gpt4 key购买 nike

我已经用这些字段创建了模型:

field_1 , field_2, field_3, ... , field_n

我想过滤这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)”其中的那一刻起,他们就可以在您的服务器上运行任意代码,从而尝试“转储数据库”等。参见 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=错误)

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

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

关于python - 检查 is_null 以获取 Django 查询集过滤中的字段列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58841701/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com