@@ -14,12 +14,17 @@ def _clone(self):
1414 s ._model = self ._model
1515 return s
1616
17- def to_queryset (self , keep_order = True ):
17+ def filter_queryset (self , queryset , keep_search_order = True ):
1818 """
19- This method return a django queryset from the an elasticsearch result.
20- It cost a query to the sql db.
19+ Filter an existing django queryset using the elasticsearch result.
20+ It costs a query to the sql db.
2121 """
2222 s = self
23+ if s ._model is not queryset .model :
24+ raise TypeError (
25+ 'Unexpected queryset model '
26+ '(should be: %s, got: %s)' % (s ._model , queryset .model )
27+ )
2328
2429 # Do not query again if the es result is already cached
2530 if not hasattr (self , '_response' ):
@@ -28,14 +33,27 @@ def to_queryset(self, keep_order=True):
2833 s = s .execute ()
2934
3035 pks = [result .meta .id for result in s ]
36+ queryset = queryset .filter (pk__in = pks )
3137
32- qs = self ._model .objects .filter (pk__in = pks )
33-
34- if keep_order :
38+ if keep_search_order :
3539 preserved_order = Case (
3640 * [When (pk = pk , then = pos ) for pos , pk in enumerate (pks )],
3741 output_field = IntegerField ()
3842 )
39- qs = qs .order_by (preserved_order )
43+ queryset = queryset .order_by (preserved_order )
44+
45+ return queryset
46+
47+ def _get_queryset (self ):
48+ """
49+ Return a django queryset that will be filtered by to_queryset method.
50+ """
51+ return self ._model ._default_manager .all ()
4052
41- return qs
53+ def to_queryset (self , keep_order = True ):
54+ """
55+ Return a django queryset from the elasticsearch result.
56+ It costs a query to the sql db.
57+ """
58+ qs = self ._get_queryset ()
59+ return self .filter_queryset (qs , keep_order )
0 commit comments