如何解决 django haystack 相关模型中的过滤问题
How to address filtering in related models in django haystack
我有以下型号:
class Note(models.Model):
user = ForeignKey(User)
topic = CharField(max_length=20)
class Referral(models.Model):
recipient = ForeignKey(User, related_name=referral_rcvd)
giver = ForeignKey(User, related_name=referral_given)
about = CharField(max_length=20)
以及 search_indexes.py
中的以下内容:
class NoteIndex(indexes.SearchIndex, indexes.Indexable):
text = indexes.EdgeNgramField(document=True, use_template=True)
topic = indexes.CharField(model_attr='topic')
我想在我的模板中看到的是:
Search for: <topic>
Results:
<ul>
<topic> <topic.user.username> <topic.user.referral_rcvd.filter(about=topic)
</ul>
在 shell 工作,所以更容易,这给了我想要的东西:
from haystack.query import SearchQuerySet as SQS
from models import *
s = SQS().models(Note).auto_query('topic_name')
[i.object.user.referral_rcvd.filter(about=i.object.topic).count() for i in s.all()]
但这在 html 模板中不起作用:
{% for result in object_list %}
{{ result.object.user.referral_rcvd.filter(about=i.object.topic).count() }}
{% endfor %}
如果它在 shell 中有效,我如何使其在模板中有效?谢谢!
终于解决了!我所做的是使用 prepare_FOO
方法:
class NoteIndex(indexes.SearchIndex, indexes.Indexable):
text = indexes.EdgeNgramField(document=True, use_template=True)
topic = indexes.CharField(model_attr='topic')
referral_count = indexes.IntegerField()
def prepare_referral_count(self, obj):
topic_name = Note.objects.get(pk=obj.pk).topic
return obj.user.referral_rcvd.filter(about=topic_name).count()
然后我 运行 python manage.py update_index
并将以下内容放入我的模板中:
{% for result in object_list %}
{{ result.referral }}
{% endfor %}
这不是 result.object.referral
,因为我们指的是索引中的内容。
我有以下型号:
class Note(models.Model):
user = ForeignKey(User)
topic = CharField(max_length=20)
class Referral(models.Model):
recipient = ForeignKey(User, related_name=referral_rcvd)
giver = ForeignKey(User, related_name=referral_given)
about = CharField(max_length=20)
以及 search_indexes.py
中的以下内容:
class NoteIndex(indexes.SearchIndex, indexes.Indexable):
text = indexes.EdgeNgramField(document=True, use_template=True)
topic = indexes.CharField(model_attr='topic')
我想在我的模板中看到的是:
Search for: <topic>
Results:
<ul>
<topic> <topic.user.username> <topic.user.referral_rcvd.filter(about=topic)
</ul>
在 shell 工作,所以更容易,这给了我想要的东西:
from haystack.query import SearchQuerySet as SQS
from models import *
s = SQS().models(Note).auto_query('topic_name')
[i.object.user.referral_rcvd.filter(about=i.object.topic).count() for i in s.all()]
但这在 html 模板中不起作用:
{% for result in object_list %}
{{ result.object.user.referral_rcvd.filter(about=i.object.topic).count() }}
{% endfor %}
如果它在 shell 中有效,我如何使其在模板中有效?谢谢!
终于解决了!我所做的是使用 prepare_FOO
方法:
class NoteIndex(indexes.SearchIndex, indexes.Indexable):
text = indexes.EdgeNgramField(document=True, use_template=True)
topic = indexes.CharField(model_attr='topic')
referral_count = indexes.IntegerField()
def prepare_referral_count(self, obj):
topic_name = Note.objects.get(pk=obj.pk).topic
return obj.user.referral_rcvd.filter(about=topic_name).count()
然后我 运行 python manage.py update_index
并将以下内容放入我的模板中:
{% for result in object_list %}
{{ result.referral }}
{% endfor %}
这不是 result.object.referral
,因为我们指的是索引中的内容。