2017-02-04 91 views
0

我有以下型號:如何地址過濾相關模型在Django草垛

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 %} 

如果它工作在殼,我怎麼讓它在模板工作?謝謝!

回答

0

終於解決了!我所做的就是使用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因爲我們指的是在索引中的東西。