假设我有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
这是另一个类似的问题,但不完全相同,并且再次没有答案。
答案 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
限制为一个或多个模型。