繁体   English   中英

选择要与SearchQuerySet一起使用的模型

[英]Selecting models to use with SearchQuerySet

我有一些代码包含如下搜索功能:

def searchHay(request):
    content = sorted(request.GET.getlist('content', ''))
    sqs =  SearchQuerySet().facet('this').facet('that').facet('the_other')

    # This if/else block is perhaps not a very good solution...
    if "things" in content and "stuff" in content:
        sqs = sqs.models(Things, Stuff)
    elif "things" in content:
        sqs = sqs.models(Things)
    elif "stuff" in content:
        sqs = sqs.models(Stuff)

    sqs = sqs.order_by('sort_field')
    view = search_view_factory(
        view_class=FacetedSearchView,
        template='search/search.html',
        searchqueryset=sqs,
        form_class=AllFacetedSearchForm
    )
    return view(request)

如您所见,将根据用户提交表单时选择的某些选项来搜索不同的模型,这些选项在此处作为“内容”传递。 这可行,但是随着模型数量的增加变得非常麻烦。 如果有人对采用更优雅的方法有任何建议,那么我很想知道它们是什么。

一种简单的解决方案可能是使用“ 独立的ifs ”,而不是:

# This if/else block is perhaps not a very good solution...
if "things" in content and "stuff" in content:
    sqs = sqs.models(Things, Stuff)
elif "things" in content:
    sqs = sqs.models(Things)
elif "stuff" in content:
    sqs = sqs.models(Stuff)

你可以有:

if "things" in content:
    sqs = sqs.models(Things)

if "stuff" in content:
    sqs = sqs.models(Stuff)

有了这个,你不需要管理“多项选择”,如果有thingsstuff在内容上,它会自动添加两个过滤器。 而且,如果将来需要添加更多模型,则只需为每个模型添加一个即可。

我认为如果您执行sqs = sqs.models(Things) ,然后执行sqs = sqs.models(Stuff) ,结果将为0或为空,但是...

我在控制台上对其进行了测试,以确保感到惊讶。

  1. sqs = sqs.models(Things)
  2. sqs.count() <-此返回值可以说是100
  3. sqs = sqs.models(Stuff)
  4. sqs.count() <- 这将返回100 + Stuff模型的对象

因此,您可以具有独立的ifs,并且它将按您的预期工作,因为似乎您可以这样做:

  1. sqs = sqs.models(Things)
  2. sqs = sqs.models(Stuff)

将与sqs.models(Things, Stuff)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM