【问题标题】:Haystack change SearchQuerySet of SearchForm干草堆更改 SearchQuerySet 的 SearchForm
【发布时间】:2014-07-18 20:29:54
【问题描述】:

我想自定义搜索表单的 SearchQuerySet 以搜索所有可能的结果,例如 sql 表达式“LIKE”,文档说:

搜索表单 最基本的表单类型,该表单由单个字段 q 字段(用于查询)组成。搜索时,表单将获取 q 字段的清理内容,并在您提供的自定义 SearchQuerySet 或默认 SearchQuerySet 上执行 auto_query。

要自定义表单将使用的 SearchQuerySet,请将 searchqueryset 参数传递给带有您想使用的 SearchQuerySet 的构造函数。如果将此表单与 SearchView 结合使用,该表单将接收您提供给视图的任何 SearchQuerySet,而无需额外工作。

是否可以将 auto_query 更改为 icontains 搜索?

这是我的课,我要修改哪里?:

class ContactSearchForm(HighlightedModelSearchForm):
    name = forms.CharField(max_length=100,required=False)
    surname = forms.CharField(max_length=100,required=False)
    work = forms.CharField(max_length=100,required=False)
    province =  forms.CharField(max_length=100,required=False)
    status = forms.CharField(max_length=100,required=False)
    sex =  forms.CharField(max_length=100,required=False)
    city =  forms.CharField(max_length=100,required=False)
    street =  forms.CharField(max_length=100,required=False)
    zip =  forms.CharField(max_length=100,required=False)


    def no_query_found(self):
        return self.searchqueryset

    def search(self):
        sqs = super(ContactSearchForm,self).search()

        if not self.is_valid():
            return self.no_query_found()

        if self.cleaned_data['name']:
            sqs = sqs.filter(content__icontains = self.cleaned_data["name"])
        if self.cleaned_data['surname']:
            sqs = sqs.filter(content__icontains = self.cleaned_data['surname'])
        if self.cleaned_data['work']:
            sqs = sqs.filter(content__icontains = self.cleaned_data['work'])
        if self.cleaned_data['province']:
             sqs = sqs.filter(content__icontains = self.cleaned_data['province'])
        if self.cleaned_data['status']:
             sqs = sqs.filter(content__icontains = self.cleaned_data['status'])
        if self.cleaned_data['sex']:
             sqs = sqs.filter(content__icontains = self.cleaned_data['sex'])
        if self.cleaned_data['city']:
            sqs = sqs.filter(content__icontains = self.cleaned_data['city'])
        if self.cleaned_data['street']:
            sqs = sqs.filter(content__icontains = self.cleaned_data['street'])
        if self.cleaned_data['zip']:
            sqs = sqs.filter(content__icontains = self.cleaned_data['zip'])

        return sqs

【问题讨论】:

    标签: python django search django-haystack


    【解决方案1】:

    问题是您正在调用已经执行 auto_query 的父类搜索方法。你不需要这样做:

    sqs = super(ContactSearchForm,self).search()
    

    这应该是您的搜索方法:

    def search(self):
        if not self.is_valid():
            return self.no_query_found()
    
        sqs = self.searchqueryset
        for key, value in self.cleaned_data.items():
            if value:
                sqs = sqs.filter(content__icontains=value)
    
        if self.load_all:
            sqs = sqs.load_all()
    
        return sqs
    

    【讨论】:

    • 感谢您的回复。我已经尝试过这段代码,没关系,但是当我尝试搜索“Rossi”的姓氏时,他只返回带有“Rossi”的姓氏而不是带有“Rossini”的姓氏,为什么?编辑:当我在搜索表单中输入“R”时,他返回 null...
    • 常规文本字段可能未编入索引以返回部分匹配。根据我对 Haystack 的默认行为的了解,只有 autocomplete 字段(以及使用它们的搜索)返回部分匹配项。例如,对于 SOLR 后端,他们使用 EdgeNgramFields 将“Rossini”索引到“R”、“Ro”、“Ros”等标记中。而常规文本字段将仅包含标记“Rossini”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-03
    相关资源
    最近更新 更多