1

このあたりのドキュメントといくつかの質問を読んでいて、2つの異なるクラスでインデックス付けされたフィールドを持つクエリを返す方法を理解できませんでした。以下にコードを入れましょう:

ここにクラスがあります:

class T031003Index(RealTimeSearchIndex):
text = CharField(document=True, use_template=True)
C003INST = IntegerField(model_attr='C003INST')
C003CHCD = CharField(model_attr='C003CHCD')
C003MTR = CharField(model_attr='C003MTR')
C003RZSC = CharField(model_attr='C003RZSC')

def index_queryset(self):
    return T031003.objects.all()

def prepare(self, obj):
    self.prepared_data = super(T031003Index, self).prepare(obj)
    self.prepared_data['text'] = obj.C003CHCD
    return self.prepared_data

site.register(T031003, T031003Index)

そして2番目のもの:

class T031002Index(RealTimeSearchIndex):
text = CharField(document=True, use_template=True)
C002USER = CharField(model_attr='C002USER')

def index_queryset(self):
    return T031002.objects.all()

def prepare(self, obj):
    self.prepared_data = super(T031002Index, self).prepare(obj)
    self.prepared_data['text'] = obj.C002USER
    return self.prepared_data
site.register(T031002, T031002Index)

そして、それぞれに2つのテンプレートインデックスがあります。

T031003_text:

{{ object.C003INST }}
{{ object.C003CHCD }}
{{ object.C003MTR }}
{{ object.C003RZSC }}

T031002_text:

{{ object.C002USER }}
{{ object.C002INST }}

私のテンプレートコード:

{% if page.object_list %}    
{% for object in page.object_list %}
    <br>
    <li><font class="font">
      {{ object.C003RZSC }}, {{ object.C003INST }}, {{ object.C003CHCD }}, {{ object.C003MTR }}, {{ object.C002USER }}
    </li>
{% endfor %}

私の見解:

def search(req):
return SearchView(template='search.html')(req)

たとえば、クラスT031002Index(user = "vane"など)に属するフィールドの値を検索ボックスに入力すると、次の結果が得られます。

「なし、なし、なし、なし、羽根」

また、クラスT031003Indexのフィールドから値を入力すると、次の結果が得られます。

「鉛筆、1、教材、一般、なし」

私はmodels.pyのこれら2つのクラスの間に、C002INSTである外部キーフィールドを持っています。

説明してもらえますか?簡単そうに見えますが、自分ではわかりません。

前もって感謝します!

4

1 に答える 1

1

それで、親しい友人からの少しの助けとたくさんの研究の後で、私は解決策を見つけることができました。

1)Haystack1.2.6からHaystack2.0.0にアップグレードしました

2)私の見解では、AutoQueryとSearchQuerySetを使用するようにコードを変更しました。複数の単語を使用してコンテンツを検索し、結果をフィルタリングできます。

ビューは次のとおりです。

def search(request):
sqs = SearchQuerySet().filter(content=AutoQuery(request.GET['q']))
return  render_to_response('search.html', {'sqs': sqs,})

4)ここで、「search_indexes.py」で、Haystackの2.0.0バージョンに従うようにコードを変更し、外部キー(T031002Index、C002INSTフィールド)から「model_attr」を削除しました。

コードは次のとおりです。

class T031003Index(RealTimeSearchIndex,Indexable):
   text = CharField(document=True, use_template=True)
   C003INST = IntegerField(model_attr='C003INST')
   C003CHCD = CharField(model_attr='C003CHCD')
   C003MTR = CharField(model_attr='C003MTR')
   C003RZSC = CharField(model_attr='C003RZSC')

def index_queryset(self):
    return T031003.objects.all()

def get_model(self):
    return T031003


class T031002Index(RealTimeSearchIndex,Indexable):
    text = CharField(document=True, use_template=True)
    C002INST = CharField()
    C002USER = CharField(model_attr='C002USER')

def index_queryset(self):
    return T031002.objects.all()

def get_model(self):
    return T031002

しかし、これらすべての変更があっても、Haystackは2つのインデックスを反復処理し、nullの結果を返します。これは間違っており、ユーザーを混乱させる可能性もあります。そこで、null以外の結果が得られた場合にのみフィールドを表示するように、テンプレートを変更しました。

{% if page.object_list %}    
{% for result in page.object_list %}
    {% if result.object.C003MTR%}
    <li><b>Matrícula:</b> {{ result.object.C003MTR }}</li>
    <li><b>CPF/CNPJ:</b> {{ result.object.C003CHCD }}</li>
    {% endif %}
    {% if result.object.C002INST %}
    <li><b>ID Instituição:</b> {{ result.object.C002INST }}</li>
    <li><b>Usuário:</b> {{ result.object.C002USER }}</li>
    {% endif %}
{%endfor%}

「if」は、フィールドの結果がnullかどうかをテストするためのトリックを実行します。

DjangoでHaystackを使用している他の開発者に役立つことを願っています。

于 2012-07-01T23:13:38.857 に答える