按模型类型查找干草堆结果的数量?

时间:2012-06-19 13:31:48

标签: django django-haystack whoosh

假设我有3个模型(注释,评论,文章),我想用django-haystack搜索,我设置了3个这样的索引。

class NoteIndex(SearchIndex):
    text = CharField(document=True, use_template=True)
    author = CharField(model_attr='user', faceted=True)
    pub_date = DateTimeField(model_attr='pub_date')

class CommentIndex(SearchIndex):
    text = CharField(document=True, use_template=True)
    author = CharField(model_attr='user', faceted=True)
    pub_date = DateTimeField(model_attr='pub_date')

class ArticleIndex(SearchIndex):
    text = CharField(document=True, use_template=True)
    author = CharField(model_attr='user', faceted=True)
    pub_date = DateTimeField(model_attr='pub_date')

当我得到结果时,我可以使用作者方面来显示作者的结果数量。

>>> from haystack.query import SearchQuerySet
>>> sqs = SearchQuerySet().facet('author')
>>> sqs.facet_counts()
{
    'dates': {},
    'fields': {
        'author': [
            ('john', 4),
            ('daniel', 2),
            ('sally', 1),
            ('terry', 1),
        ],
    },
    'queries': {}
}

但是如何通过Model类型找出多少结果呢?例如。

注意:4 评论:2 文章:1

理想情况下,我想过滤它,就像普通方面一样。我现在正在使用FacetedModelSearchForm,我可以看到模型类型,只是无法获取计数值。这可能吗?如果是这样,怎么样?

类似问题:

看起来其他人也问过这个问题,但也许没有问清楚这个问题。

Django Haystack faceting on the model type

这个类似,但他们只想按内容类型排序,我希望按内容类型计算。

Using django-haystack, how do I order results by content type

这是另一个类似的问题,但不完全相同,并且再次没有答案。

Django Haystack Faceting examples

3 个答案:

答案 0 :(得分:2)

您是否尝试过为此创建另一个方面?唯一可能困难的部分是获取型号名称。大多数情况下,您可能希望使用verbose_name,因此它更具可读性,您可以从_meta.verbose_name获取。但是,类似下面的代码可能不会工作:

model = CharField(model_attr='_meta.verbose_name', faceted=True)

因此,您只需向模型中添加一个方法即可返回此值:

def get_model_name(self):
    return self._meta.verbose_name

然后:

model = CharField(model_attr='get_model_name', faceted=True)

所有这些都是未经测试的,因为我自己从未需要这样做。

答案 1 :(得分:1)

最佳解决方案是通过重新组合与dictsort django的模板过滤器关联的django' stemplatetag重新组合django模板中的对象(重新组合仅适用于有序查询集):

{% with page.object_list as results %}

   {% regroup results|dictsort:"model_name" by model_name as grouped_objects %}

   {% for ct in grouped_objects %}

      {{ ct.grouper }} (Total: {{ct.list|length}}

      {% for result in ct.list %}

      <p><a href="{{ result.object.get_absolute_url }}">{{ result.object }}</a></p>

      {% endfor %}

   {% empty %}

      <p>No results found.</p>

   {% endfor %}

{% endwith %}

如果您不想丢失原始订单,请务必按照(&#39; model_name&#39;,* your_order_fields)排序的SearchQueryset

答案 2 :(得分:0)

尝试以下方法:

sqs1 = SearchQuerySet().models(Note).facet('author')
print sqs1.facet_counts()

sqs2 = SearchQuerySet().models(Comment).facet('author')
print sqs2.facet_counts()

sqs3 = SearchQuerySet().models(Article).facet('author')
print sqs3.facet_counts()

# multiple models are allowed as well:
sqs4 = SearchQuerySet().models(Note, Article).facet('author')
print sqs4.facet_counts()

在计算构面计数之前,这会将SearchQuerySet限制为一个或多个模型。