4

假设我想使用 django-haystack 搜索 3 个模型(注释、评论、文章),并设置了 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': {}
}

但是我怎样才能找出模型类型有多少结果呢?例如。

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

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

类似问题:

看起来其他人也问过这个问题,但可能没有问得足够清楚。

模型类型上的 Django Haystack 刻面

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

使用 django-haystack,如何按内容类型对结果进行排序

这是另一个类似的问题,但不完全相同,同样也没有答案。

Django Haystack 分面示例

4

3 回答 3

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)

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

于 2012-06-19T15:14:41.047 回答
1

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

{% 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 %}

如果您不想丢失原始订单,请务必通过 ('model_name',*your_order_fields) 排序的 SearchQueryset

于 2016-05-11T11:08:42.983 回答
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这将在计算方面计数之前限制为一个或多个模型。

于 2012-06-19T13:37:54.697 回答