@@ -14,12 +14,17 @@ def _clone(self):
14
14
s ._model = self ._model
15
15
return s
16
16
17
- def to_queryset (self , keep_order = True ):
17
+ def filter_queryset (self , queryset , keep_search_order = True ):
18
18
"""
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.
21
21
"""
22
22
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
+ )
23
28
24
29
# Do not query again if the es result is already cached
25
30
if not hasattr (self , '_response' ):
@@ -28,14 +33,27 @@ def to_queryset(self, keep_order=True):
28
33
s = s .execute ()
29
34
30
35
pks = [result .meta .id for result in s ]
36
+ queryset = queryset .filter (pk__in = pks )
31
37
32
- qs = self ._model .objects .filter (pk__in = pks )
33
-
34
- if keep_order :
38
+ if keep_search_order :
35
39
preserved_order = Case (
36
40
* [When (pk = pk , then = pos ) for pos , pk in enumerate (pks )],
37
41
output_field = IntegerField ()
38
42
)
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 ()
40
52
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