tags:

views:

174

answers:

1

Is it possible to intersect 2 querysets: SphinxQuerySet and normal django's QuerySet ?

I need to filter SphynxQuerySet by ordinary django's filters. What the best way to do that?

I try go this direction:

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

But I feel that's not best method for my purpose.

+1  A: 

At one point there was a (now fixed) bug in django-sphinx where filters from previous queries weren't being cleared, which meant I had to do full search without any filters and then intersect with normal filters. This is how I did it:

# 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

This isn't as efficient as letting sphinx do the filtering of course, but I didn't have a choice at the time.

Maybe you can re-think your strategy so you don't need to manually filter the query yourself?

Van Gale
thanks for more convenient syntax! Do you change built-in hardcoded limit of SphynxQuerySet self._limit = 20 to greater value? I didn't find method to do this through standart interface.
ramusus
I actually like your use of id__in=ids better than my solution, but there was some reason I couldn't do that... lost to the mists of time :) I don't think I did anything with self._limit, but that's probably because the site never went live :)
Van Gale