est-il possible de combiner une recherche de Django HAYStack avec des opérations de filtre de querySet "intégrées", filtrant spécifiquement des instances Q () et des types de recherche non pris en charge par SearchQuiserySet? Dans l'un ou l'autre ordre: ou p> navigation de navigation de la documentation de Django HaNstack n'a donné aucune direction comment faire cela. P > p>
3 Réponses :
Vous pouvez filtrer votre queryset en fonction des résultats d'une recherche de fointes, à l'aide des objets des objets:
def view(request): if request.GET.get('q'): from haystack import ModelSearchForm form = ModelSearchForm(request.GET, searchqueryset=None, load_all=True) searchqueryset = form.search() results = [ r.pk for r in searchqueryset ] docs = Document.objects.filter(pk__in=results) # do something with your plain old regular queryset return render_to_response('results.html', {'documents': docs});
Avec cela, vos résultats seront triés par IDS et vous perdrez la pertinence.
@ Dzen Quelle est la meilleure façon de le faire tout en conservant le rang de pertinence, alors?
Cela n'échappe pas. Je suppose que la requête devient trop longue - avec quelques milliers d'identifiants il y aura 0 résultats.
Si vous souhaitez suivre la pertinence, vous devez accéder à l'objet de la base de données via "Objet":
Exemple dans votre modèle: P>
{% for result in results %} {{ result.title }} {{ result.author }} {% endfor %}
Si vous exécutez RECHERCHERQUERYSET.LOAD_ALL (), les objets seront tous préchargés de la base de données aussi efficacement que possible, au lieu d'une à la fois.
Avec quelque chose comme "Select * du bla où ID dans (12, 132 1251)" de sorte que cela est efficace, à ouvrir (peut-être) une nouvelle prise, récupérez des données de là?
de la DOCS:
searchQuiseryset.load_all (auto) strong> p> Pumpule efficacement les objets dans les résultats de la recherche. Sans utiliser
Cette méthode, les recherches de dB sont effectuées sur une base d'objet, entraînant
de nombreux voyages individuels dans la base de données. Si load_all est utilisé, le
SearchQuiserySet va grouper des objets similaires dans une seule requête,
résultant uniquement autant de requêtes que certains types d'objets différents
retourné. p>
blockQuote> http: // Django-Haystack. readthedocs.org/en/latest/searchQueryset_api.html#load-all p> Par conséquent, après avoir eu un SQ filtré, vous pouvez effectuer une connexion LOAD_ALL () dessus et accéder à des objets de base de données via SearchResult.Object. Par exemple. p>