我的模特是
class TestModel(models.Model)
field1 = models.IntegerField()
field2 = models.IntegerField()
field3 = models.IntegerField()
field4 = models.IntegerField()
field5 = models.IntegerField()
我需要一个简单的查询集,该查询集将单个条件应用于模型的所有五个字段,而无需编写字段的每种组合并对其进行过滤。
例如,我想对两个或多个字段应用检查无的条件
TestModel.objects.filter(two_or_more_fields=None)
我不想写5个字段的每种可能的组合来查找具有任何两个或多个字段作为None的查询集。换句话说,有比以下方法更好的方法:
from django.db.models import Q
TestModel.objects.filter(
#condition for exactly 2 None
Q(field1=None & field2=None) |
Q(field2=None & field3=None) |
Q(field3=None & field4=None) |
Q(field4=None & field5=None) |
Q(field5=None & field1=None) |
#condition for more than 2 None
Q(field1=None & field2=None & field3 = None) |
'''''
.
.
#so on to cover all possible cases of any two or more fields as None
)
我认为应该有一个更好,更简单的方法来实现这一目标。
花了几个小时后,我找不到使用内置的Django过滤器构造执行此操作的简单方法。但是我找到了这个解决方案,它更接近我要寻找的解决方案:
field_list = ['field1', 'field2', 'field3', 'field4', 'field5']
def get_all_possible_filter_dict_list_for_a_condition(field_list):
all_possible_filter_dict_for_a_condition = []
for field_1, field_2 in combinations(field_list, 2):
all_possible_filter_dict_for_a_condition.append(
{
field_1:None,
field_2:None
}
)
return all_possible_filter_dict_for_a_condition
def get_qs_list_to_perform_or_operation(all_possible_filter_dict_list_for_a_condition):
qs_list_to_perform_or_operation = []
for i, filter_dict in enumerate(all_possible_filter_dict_list_for_a_condition):
qs_to_append = qs.filter(**filter_dict)
qs_list_to_perform_or_operation.append(qs_to_append)
return qs_list_to_perform_or_operation
def get_qs_to_filter_fields_with_more_than_1_none(qs_list_to_perform_or_operation ):
final_qs = qs_list_to_perform_or_operation [0]
for i in range(len(qs_list_to_perform_or_operation ) - 1):
final_qs = final_qs | qs_list[i + 1]
return final_qs
all_possible_filter_dict_list_for_a_condition
= get_all_possible_filter_dict_list_for_a_condition(field_list)
qs_list_to_perform_or_operation = get_qs_list_to_perform_or_operation(all_possible_filter_dict_list_for_a_condition)
final_qs_to_filter_multiple_fields_with_same_condtion = get_qs_to_filter_fields_with_more_than_1_none(qs_list_to_perform_or_operation)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句