在模型中的所有CharField中按特定模式过滤

时间:2012-11-23 15:28:53

标签: django django-models django-forms

我的项目中有一个serach框,问题是用户可以输入任何关键字,我的ModelForm会过滤我明确指示过滤的字段,我在表单中使用以下代码:

def get_matching_siniestros(self):
    if self.cleaned_data['keywords'] is None:
        return None
    matching = []
    for kw in self.cleaned_data['keywords']:
        numero_ajuste = Siniestro.objects.filter(
            numero_ajuste__icontains=kw
        )

        nombre_contratante = Siniestro.objects.filter(
            poliza__contratante__nombre__icontains=kw
        )


        matching = chain(
            numero_ajuste, 
            nombre_contratante,
            matching
        )

    # verify not repeated Siniestro
    non_rep_siniestros = []
    for siniestro in matching:
        if siniestro not in non_rep_siniestros:
            non_rep_siniestros.append(siniestro)

    return non_rep_siniestros

我想要做的是以编程方式过滤模型中的任何CharField,并且如果可能的话,在嵌套关系的任何CharField上,在这个示例中,Siniestro有一个FK到poliza,poliza有一个FK到contratante。

1 个答案:

答案 0 :(得分:1)

你可以迭代每个字段并做任何你喜欢的事情,例如:

[process(field) for field in model._meta.fields if field.__class__ == CharField]

其中,流程可以是一个功能,也可以是您需要的任何功能。

那就是说,我应该指出,你试图涉及的复杂性必然会变得混乱。国际海事组织,请看django-haystack。索引应该是要走的路。