2017-02-04 1 views
0

Ich habe die folgenden Modelle:Wie Filterung in verwandten Modellen zur Adresse in django Heuhaufen

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) 

und die folgenden in search_indexes.py:

class NoteIndex(indexes.SearchIndex, indexes.Indexable): 
    text = indexes.EdgeNgramField(document=True, use_template=True) 
    topic = indexes.CharField(model_attr='topic') 

Was will ich in meiner Vorlage zu sehen ist:

Search for: <topic> 

Results: 
<ul> 
<topic> <topic.user.username> <topic.user.referral_rcvd.filter(about=topic) 
</ul> 

Arbeiten in der Shell so ist es einfacher, das gibt mir, was ich will:

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()] 

Aber das funktioniert nicht im HTML-Template:

{% for result in object_list %} 
    {{ result.object.user.referral_rcvd.filter(about=i.object.topic).count() }} 
{% endfor %} 

Wenn es in der Shell funktioniert, wie ich es in der Vorlage funktioniert? Vielen Dank!

Antwort

0

Endlich gelöst! Was ich tat, war die prepare_FOO Methode zu verwenden:

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() 

Dann lief ich python manage.py update_index und stellte folgendes in meiner Vorlage:

{% for result in object_list %} 
    {{ result.referral }} 
{% endfor %} 

Es ist nicht result.object.referral da wir etwas im Index sich beziehen.

Verwandte Themen