2010-06-08 5 views
8

J'utilise django-haystack pour une page de recherche sur mon site. Je suis fondamentalement fait, mais pas tout à fait heureux avec la commande et pas tout à fait sûr comment la meule de foin décide comment commander tout.Commande de django-haystack - Comment gérer ceci?

Je sais que je peux survoler le SearchQuerySet en utilisant order_by mais cela l'écrase entièrement. Disons que je veux forcer la recherche en stock (BooleanField), de sorte que les produits en stock apparaissent en haut, mais font tout le reste comme d'habitude. Comment je fais ça?

J'ai essayé de faire order_by('-in_stock', 'content') le contenu figuré était ce qu'il utilisait par défaut mais il produit des résultats très différents si je le laisse juste faire sa propre commande.

Merci pour toute contribution à ce sujet!

Répondre

18

Vous devez avoir un index dans votre search_indexes.py avec in_stock:

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

et dans vos urls:

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

De cette façon, vous montrer les résultats d'abord si elles sont en stock et ensuite par score!

+0

Que se passe-t-il si mon champ personnalisé a le même nom 'score'? – eugene

+0

est-il possible que la version actuelle de Haystack ne supporte pas le classement par score? J'ai 'KeyError: Aucun champ nommé 'score'' – maciek

+0

Je viens de vérifier les docs et cela devrait encore fonctionner, pourriez-vous me montrer un peu plus de votre code avec http://dpaste.com? – diegueus9

2

Pour trier sur un CharField, le rendre stockable, mais non indexable.

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

Si vous avez besoin de le trier et de l'indexer, utilisez deux champs différents dans SearchIndex.