我正在阅读这里的文档和一些问题,并且无法理解如何返回在两个不同的类中编入索引的字段的查询。让我把代码放在下面:
我在这里有课程:
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)
第二个:
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)
我有两个模板索引:
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中的这两个类之间有一个外键字段,即C002INST。
你们可以给我解释一下吗?这似乎很容易,但我自己无法弄明白。提前致谢!
答案 0 :(得分:1)
所以,经过亲密朋友的一些帮助和大量的研究,我找到了解决方案。
1)我从Haystack 1.2.6升级到Haystack 2.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”中,我将代码更改为遵循2.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也会迭代这两个索引并返回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”将测试该字段是否为空结果。
希望它可以帮助其他开发人员使用Haystack和Django。