2010-06-08 7 views
8

Ich benutze Django-Heuhaufen für eine Suchseite auf meiner Website. Ich bin im Grunde fertig, aber nicht ganz zufrieden mit der Bestellung und nicht ganz sicher, wie Heuhaufen entscheidet, wie alles zu bestellen ist.Django-Heuhaufen-Bestellung - Wie gehe ich damit um?

Ich weiß, dass ich das SearchQuerySet übersteuern kann, indem ich order_by verwende, aber das übertrumpft es vollständig. Nehmen wir an, ich möchte die Suche durch "Auf Lager" (BooleanField) erzwingen, so dass die Produkte, die auf Lager sind, oben angezeigt werden, aber dann alles andere tun, als es normalerweise der Fall wäre. Wie mache ich das?

Ich habe versucht, Figur Inhalt war, was es standardmäßig verwendet, aber es produziert sehr unterschiedliche Ergebnisse von, wenn ich es einfach zu seiner eigenen Bestellung zu verlassen.

Danke für jede Eingabe zu diesem Thema!

Antwort

18

Sie müssen einen Index in Ihrem search_indexes.py mit in_stock haben:

class YourModel(indexes.SearchIndex): 
    in_stock = indexes.BooleanField(model_attr='model_in_stock') 

und in Ihrem Urls:

sqs = SearchQuerySet().models(YourModel).order_by('-in_stock', 'score') # score is a field of haystack 

Auf diese Weise zeigen Ihnen die Ergebnisse zuerst, wenn sie auf Lager sind und dann nach Punktzahl!

+0

Was passiert, wenn mein benutzerdefiniertes Feld den gleichen Namen "score" hat? – eugene

+0

ist es möglich, dass die aktuelle Version von Haystack die Bestellung nach Punktzahl nicht unterstützt? Ich habe 'KeyError: Kein Feld namens 'score'' – maciek

+0

Ich habe gerade die Dokumente überprüft und es sollte noch funktionieren, können Sie mir ein wenig mehr von Ihrem Code mit http://dpaste.com zeigen? – diegueus9

2

Um ein CharField zu sortieren, machen Sie es speicherbar, aber nicht indexierbar.

sorted_name = indexes.CharField(indexed=False, stored=True) 

Wenn Sie es sortierbar und Wende haben müssen, zwei verschiedene Felder im Suchindex verwenden.

Verwandte Themen