2017-02-04 84 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因为我们指的是在索引中的东西。