2017-02-04 14 views
0

я следующие модели:Как решать вопросы фильтрации в родственных моделей Джанго Стог

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> 

Работа в оболочке, так что это проще, это дает мне то, что я хочу:

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, так как мы ссылаемся на что-то в индексе.