@@ -39,9 +39,9 @@ def list_resolver(django_object_type, resolver, root, info, **args):
39
39
if queryset is None :
40
40
# Default to Django Model queryset
41
41
# N.B. This happens if DjangoListField is used in the top level Query object
42
- model = django_object_type ._meta .model
42
+ model_manager = django_object_type ._meta .model . objects
43
43
queryset = maybe_queryset (
44
- django_object_type .get_queryset (model . objects , info )
44
+ django_object_type .get_queryset (model_manager , info )
45
45
)
46
46
return queryset
47
47
@@ -108,25 +108,13 @@ def get_manager(self):
108
108
109
109
@classmethod
110
110
def resolve_queryset (cls , connection , queryset , info , args ):
111
+ # queryset is the resolved iterable from ObjectType
111
112
return connection ._meta .node .get_queryset (queryset , info )
112
113
113
114
@classmethod
114
- def merge_querysets (cls , default_queryset , queryset ):
115
- if default_queryset .query .distinct and not queryset .query .distinct :
116
- queryset = queryset .distinct ()
117
- elif queryset .query .distinct and not default_queryset .query .distinct :
118
- default_queryset = default_queryset .distinct ()
119
- return queryset & default_queryset
120
-
121
- @classmethod
122
- def resolve_connection (cls , connection , default_manager , args , iterable ):
123
- if iterable is None :
124
- iterable = default_manager
115
+ def resolve_connection (cls , connection , args , iterable ):
125
116
iterable = maybe_queryset (iterable )
126
117
if isinstance (iterable , QuerySet ):
127
- if iterable .model .objects is not default_manager :
128
- default_queryset = maybe_queryset (default_manager )
129
- iterable = cls .merge_querysets (default_queryset , iterable )
130
118
_len = iterable .count ()
131
119
else :
132
120
_len = len (iterable )
@@ -150,6 +138,7 @@ def connection_resolver(
150
138
resolver ,
151
139
connection ,
152
140
default_manager ,
141
+ queryset_resolver ,
153
142
max_limit ,
154
143
enforce_first_or_last ,
155
144
root ,
@@ -177,9 +166,15 @@ def connection_resolver(
177
166
).format (last , info .field_name , max_limit )
178
167
args ["last" ] = min (last , max_limit )
179
168
169
+ # eventually leads to DjangoObjectType's get_queryset (accepts queryset)
170
+ # or a resolve_foo (does not accept queryset)
180
171
iterable = resolver (root , info , ** args )
181
- queryset = cls .resolve_queryset (connection , default_manager , info , args )
182
- on_resolve = partial (cls .resolve_connection , connection , queryset , args )
172
+ if iterable is None :
173
+ iterable = default_manager
174
+ # thus the iterable gets refiltered by resolve_queryset
175
+ # but iterable might be promise
176
+ iterable = queryset_resolver (connection , iterable , info , args )
177
+ on_resolve = partial (cls .resolve_connection , connection , args )
183
178
184
179
if Promise .is_thenable (iterable ):
185
180
return Promise .resolve (iterable ).then (on_resolve )
@@ -192,6 +187,10 @@ def get_resolver(self, parent_resolver):
192
187
parent_resolver ,
193
188
self .connection_type ,
194
189
self .get_manager (),
190
+ self .get_queryset_resolver (),
195
191
self .max_limit ,
196
192
self .enforce_first_or_last ,
197
193
)
194
+
195
+ def get_queryset_resolver (self ):
196
+ return self .resolve_queryset
0 commit comments