Django haystack SearchQuerySet to QuerySet

Sal*_*ala 5 django solr django-queryset django-haystack

我有一个非常通用的视图/模板来显示给定模型的查询集的内容.
我使用12个地方有12个不同的查询集,现在我想在那里集成haystack搜索,但我不能,因为SearchQuerySet与模板中的QuerySet不匹配.

使用正常的查询集我做

{%for obj in qs%}
    {{obj.foreign_key.name }}
{%endfor%}
Run Code Online (Sandbox Code Playgroud)

使用SearchQuerySet我需要做

{%for obj in qs%} 
   {{obj.object.foreign_key.name}}
{%endfor%}
Run Code Online (Sandbox Code Playgroud)

这基本上打破了我的通用模板和视图,现在知道查询集的来源.

我想要一种方法让searchqueryset像普通的查询集一样,我知道:

  • 我会失去分数,虽然我会保留命令
  • 我需要做一个load_all()来获取整个对象

有关如何保持模板通用但接受SearchQuerySet或将SearchQuerySet转换为QuerySet的任何提示?

小智 7

我使用了一个简洁的生成器技巧,可以避免向object模型添加方法,并允许您为Django QuerySet和Haystack 使用相同的模板SearchQuerySet.

诀窍是将SearchQuerySet包装到生成器中.

# In your view...

def queryset_gen(search_qs):
    for item in search_qs:
        yield item.object  # This is the line that gets the model instance out of the Search object

qs = queryset_gen(sqs)
Run Code Online (Sandbox Code Playgroud)

这种方法的优点是它维护了返回SearchQuerySet的顺序,并节省了计算和内存,因为您不需要创建或存储列表的另一个实例.


Mar*_*rco 0

您可以像这样创建一个数组:

q = request.GET['q']
    results = SearchQuerySet().auto_query(q)
    obj = []
    for r in results:
        obj.append(r.object)
    return render_to_response('template.html',
        {'obj': obj )
Run Code Online (Sandbox Code Playgroud)

  • 如果您这样做(我建议不要这样做),您至少应该将其包装在一个生成器类中,该类公开 count() 并在迭代期间返回该对象。否则,如果您的查询包含数千条记录,则单个请求可能会导致服务器崩溃。 (3认同)