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

标签 python django django-models django-queryset

我已经使用此字段创建模型:

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更深入地分析为什么“评估是不好的做法”。

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

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 - 检查 Django 查询集过滤中字段列表的 is_null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58841701/

相关文章:

python - 摆脱Python中的递归循环

python - 如何在 Django 中自动大写表单提交的字段?

django - 使用相关表格字段的Django模型默认排序顺序

python - 使用空白节点 (rdflib) 时,Sparql 查询返回不期望的结果

Python:高斯加权像素区域的标准差

python - 使用 Paramiko 无法忽略 socket.timeout 错误

django-models - Django : error with "username" in my custom user model - 'UserProfile' object has no attribute 'username'

Python - 查找一个数字,然后从字符串中复制它

python - 具有相关模型的 Django 查询

django 后端不支持绝对路径