如何在Django中创建基于单个条件过滤多个字段的查询集?

熟透的

我的模特是

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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在 Django 中过滤具有多个字段对象的查询集?

如何在 django-filter 中的多个字段上使用一个查找字段过滤查询集

如何在单个Django查询中使用基于字段值的条件使用多个order_by

Django - 是否可以为查询集预取单个字段的多个过滤器?

在单个查询中过滤多个字段的查询

如何在Django中基于Datefield过滤查询集?

在单个查询中基于多个字段进行分组

基于单个对象条件的过滤查询集

从单个字段过滤多个值-Django

如何在Django中基于父查询集创建预取查询集

Django如何在一个查询中基于嵌套的多对多关系过滤查询集

如何在mongo的单个查询中获取多个字段的不同值?

如何在 django rest 框架查询中获取单个字段?

单个自动过滤器中多个字段的条件自动过滤器

如何在Django中的多个字段中过滤某些项目

如何过滤多个字段的搜索查询?

如何在Elasticsearch中过滤多个字段和值?

如何在 Django Admin 中过滤外键字段的查询集

如何基于R中的多个条件创建新的数据集?

如何在术语查询中模拟多个字段

如何在Firebase中基于多个条件进行查询?

如何在单个 GET 请求中创建多个查询

如何在C#中的单个DASL过滤器查询中使用多个条件?(语法)(对于AdvancedSearch()方法)

如何在r中基于多个条件创建列?

如何在SQL查询的一个字段中求和多个字段?

SQL如何使用单个查询替换同一表的单个字段中的多个字符

如何在Django中访问查询集的特定字段?

如何在查询中添加基于另一个字段的字段

弹性搜索在单个查询请求中更新多个字段