2010-06-08 11 views
8

Estoy usando django-haystack para una página de búsqueda en mi sitio. Básicamente terminé, pero no del todo satisfecho con el pedido y no estoy muy seguro de cómo el pajar decide cómo ordenar todo.orden django-haystack - ¿Cómo manejo esto?

Sé que puedo anular el SearchQuerySet utilizando order_by pero eso lo sobrepasa por completo. Digamos que quiero forzar la búsqueda para ordenar en stock (BooleanField), para que los productos que están en stock aparezcan en la parte superior, pero luego haga todo lo demás como lo haría normalmente. ¿Cómo puedo hacer eso?

Intenté hacer order_by('-in_stock', 'content') el contenido de las figuras era lo que usaba de manera predeterminada, pero produce resultados muy diferentes a los de si solo lo dejo para hacer su propio pedido.

¡Gracias por cualquier aporte sobre este asunto!

Respuesta

18

Debe tener un índice en su search_indexes.py con in_stock:

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

y en sus URL:

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

De esta manera, se muestran los resultados en primer lugar si están en la acción y luego por puntaje!

+0

¿Qué ocurre si mi campo personalizado tiene el mismo nombre 'puntuación'? – eugene

+0

¿Es posible que la versión actual de Haystack no permita ordenar por puntuación? Tengo 'KeyError: Ningún campo llamado 'score'' – maciek

+0

Acabo de revisar los documentos y aún debería funcionar, ¿podría mostrarme un poco más de su código en http://dpaste.com? – diegueus9

2

Para ordenar en un CharField, hágalo almacenable, pero no indexable.

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

Si necesita que se pueda ordenar e indexar, use dos campos diferentes en SearchIndex.