Bom dia,
Você pode fazer com programação funcional também:
...
filtered_params = dict([(key, value) for key, value in params if value != None])
object_list = object_list.filter(**filtered_params)
...
Nos casos em que o nome do lookup é diferente do nome do atributo do dicionário params, você pode fazer um mapeamento:
...
param_to_lookup = {'nome': 'nome__icontains', 'nome_mae': 'nome_mae__icontains', 'ativo': 'is_active'}
filtered_params = dict([(param_to_lookup.get(key, key), value) for key, value in params if value != None])
object_list = object_list.filter(**filtered_params)
...
E para o caso da situação que tem que usar tanto nome do parâmetro quanto valor diferentes adiciona a condição manualmente:
...
param_to_lookup = {'nome': 'nome__icontains', 'nome_mae': 'nome_mae__icontains', 'ativo': 'is_active'}
filtered_params = dict([(param_to_lookup.get(key, key), value) for key, value in params if value != None])
if (filtered_params['situacao'] == 'CAD_HOJE'):
filtered_params['dt_cadastro__gte'] = date.today()
object_list = object_list.filter(**filtered_params)
...
Atenciosamente,
Vinicius Mendes
Analista de Sistemas