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 テンプレート内のオブジェクトを再グループ化することです (再グループ化は、順序付けられたクエリセットでのみ機能します)。

{% 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これにより、ファセット数を計算する前に、モデルが 1 つ以上に制限されます。

于 2012-06-19T13:37:54.697 に答える