Skip to content

Instantly share code, notes, and snippets.

@jorilallo
Created January 30, 2012 01:38
Show Gist options
  • Star 8 You must be signed in to star a gist
  • Fork 3 You must be signed in to fork a gist
  • Save jorilallo/1701845 to your computer and use it in GitHub Desktop.
Save jorilallo/1701845 to your computer and use it in GitHub Desktop.
Tastypie paginated search for Haystack
from django.conf.urls.defaults import *
from tastypie.paginator import Paginator
from tastypie.exceptions import BadRequest
from tastypie.resources import ModelResource
from tastypie.utils import trailing_slash
from haystack.query import SearchQuerySet, EmptySearchQuerySet
from clips.models import Clip
class ClipResource(ModelResource):
class Meta:
queryset = Clip.objects.all().order_by('-created')
resource_name = 'clips'
# Custom search endpoint
def override_urls(self):
return [
url(r"^(?P<resource_name>%s)/search/?$" % (self._meta.resource_name), self.wrap_view('get_search'), name="api_get_search"),
]
def get_search(self, request, **kwargs):
'''
Custom endpoint for search
'''
self.method_check(request, allowed=['get'])
self.is_authenticated(request)
self.throttle_check(request)
query = request.GET.get('q', None)
if not query:
raise BadRequest('Please supply the search parameter (e.g. "/api/v0/clips/search/?q=css")')
results = SearchQuerySet().models(Clip).filter(user=request.user).auto_query(query)
if not results:
results = EmptySearchQuerySet()
paginator = Paginator(request.GET, results, resource_uri='/api/v0/clips/search/')
bundles = []
for result in paginator.page()['objects']:
bundle = self.build_bundle(obj=result.object, request=request)
bundles.append(self.full_dehydrate(bundle))
object_list = {
'meta': paginator.page()['meta'],
'objects': bundles
}
object_list['meta']['search_query'] = query
self.log_throttled_access(request)
return self.create_response(request, object_list)
@ogirardot
Copy link

great i had to remove the ".object" in bundle = self.build_bundle(obj=result.object, request=request)
to make it work, but it's perfect thx.

@actongorton
Copy link

Awesome! I removed the ".filter(user=request.user)" from the results, changed everything else for my particular model and it worked perfectly. :)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment