2009-04-28 15 views
1

Ist es möglich, 2 Querysets zu schneiden: SphinxQuerySet und normale django's QuerySet?Wie schneidet man SphinxQuerySet mit QuerySet?

Ich muss SphynxQuerySet durch gewöhnliche Django-Filter filtern. Was ist der beste Weg, das zu tun?

Ich versuche diese Richtung gehen:

ids = [] 
for obj in Object.search.query(query).all(): 
     ids += [obj.id] 
qs = Object.objects.all().filter(id__in=ids).filter(some_other_filters) 

Aber ich glaube, das ist nicht beste Methode für meine Zwecke.

Antwort

1

An einem Punkt gab es einen (jetzt behobenen) Fehler in django-sphinx, wo Filter von vorherigen Abfragen nicht gelöscht wurden, was bedeutete, dass ich eine vollständige Suche ohne Filter durchführen und mich dann mit normalen Filtern überschneiden musste. Dies ist, wie ich es tat:

# First get list of objects matching criteria 
results = Object.objects.filter(qset).distinct() 

# Save id's from mysql queryset for later 
qs_ids = [object.id for object in results] 

# Do sphinx query 
search_results = Object.search.query(search_terms) 

# Now manually filter the sphinx queryset 
results = [object for object in search_results if object.id in qs_ids] 

return results 

Dies als läßt Sphinx die Filterung natürlich nicht so effizient ist, aber ich habe keine Wahl in der Zeit.

Vielleicht können Sie Ihre Strategie überdenken, so dass Sie die Abfrage nicht manuell filtern müssen?

+0

danke für die bequemere syntax! Ändern Sie das integrierte hardcoded Limit von SphynxQuerySet self._limit = 20 auf einen höheren Wert? Ich habe keine Methode gefunden, dies über die Standardschnittstelle zu tun. – ramusus

+0

Ich mag deine Verwendung von id__in = ids besser als meine Lösung, aber es gab einen Grund, warum ich das nicht tun konnte ... verloren im Nebel der Zeit :) Ich glaube nicht, dass ich irgendetwas mit self._limit gemacht habe, aber das liegt wahrscheinlich daran, dass die Seite nie live ging :) –

Verwandte Themen