我的项目中有一个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。
答案 0 :(得分:1)
你可以迭代每个字段并做任何你喜欢的事情,例如:
[process(field) for field in model._meta.fields if field.__class__ == CharField]
其中,流程可以是一个功能,也可以是您需要的任何功能。
那就是说,我应该指出,你试图涉及的复杂性必然会变得混乱。国际海事组织,请看django-haystack。索引应该是要走的路。