@@ -39,9 +39,9 @@ def list_resolver(django_object_type, resolver, root, info, **args):
3939 if queryset is None :
4040 # Default to Django Model queryset
4141 # 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
4343 queryset = maybe_queryset (
44- django_object_type .get_queryset (model . objects , info )
44+ django_object_type .get_queryset (model_manager , info )
4545 )
4646 return queryset
4747
@@ -108,25 +108,13 @@ def get_manager(self):
108108
109109 @classmethod
110110 def resolve_queryset (cls , connection , queryset , info , args ):
111+ # queryset is the resolved iterable from ObjectType
111112 return connection ._meta .node .get_queryset (queryset , info )
112113
113114 @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 ):
125116 iterable = maybe_queryset (iterable )
126117 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 )
130118 _len = iterable .count ()
131119 else :
132120 _len = len (iterable )
@@ -150,6 +138,7 @@ def connection_resolver(
150138 resolver ,
151139 connection ,
152140 default_manager ,
141+ queryset_resolver ,
153142 max_limit ,
154143 enforce_first_or_last ,
155144 root ,
@@ -177,9 +166,15 @@ def connection_resolver(
177166 ).format (last , info .field_name , max_limit )
178167 args ["last" ] = min (last , max_limit )
179168
169+ # eventually leads to DjangoObjectType's get_queryset (accepts queryset)
170+ # or a resolve_foo (does not accept queryset)
180171 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 )
183178
184179 if Promise .is_thenable (iterable ):
185180 return Promise .resolve (iterable ).then (on_resolve )
@@ -192,6 +187,10 @@ def get_resolver(self, parent_resolver):
192187 parent_resolver ,
193188 self .connection_type ,
194189 self .get_manager (),
190+ self .get_queryset_resolver (),
195191 self .max_limit ,
196192 self .enforce_first_or_last ,
197193 )
194+
195+ def get_queryset_resolver (self ):
196+ return self .resolve_queryset
0 commit comments