@@ -58,10 +58,11 @@ def get_method_type_from_dynamic_manager(
58
58
Attempt to resolve a method on a manager that was built from '.from_queryset'
59
59
"""
60
60
61
- manager_type_info = manager_instance .type
61
+ manager_type_info = manager_instance .type . get_containing_type_info ( method_name )
62
62
63
63
if (
64
- "django" not in manager_type_info .metadata
64
+ manager_type_info is None
65
+ or "django" not in manager_type_info .metadata
65
66
or "from_queryset_manager" not in manager_type_info .metadata ["django" ]
66
67
):
67
68
# Manager isn't dynamically added
@@ -235,45 +236,9 @@ def _replace_type_var(ret_type: MypyType, to_replace: str, replace_by: MypyType)
235
236
return ret_type
236
237
237
238
238
- def get_method_type_from_reverse_manager (
239
- api : TypeChecker , method_name : str , manager_type_info : TypeInfo
240
- ) -> Optional [ProperType ]:
241
- """
242
- Attempts to resolve a reverse manager's method via the '_default_manager' manager on the related model
243
- From Django docs:
244
- "By default the RelatedManager used for reverse relations is a subclass of the default manager for that model."
245
- Ref: https://docs.djangoproject.com/en/dev/topics/db/queries/#using-a-custom-reverse-manager
246
- """
247
- is_reverse_manager = (
248
- "django" in manager_type_info .metadata and "related_manager_to_model" in manager_type_info .metadata ["django" ]
249
- )
250
- if not is_reverse_manager :
251
- return None
252
-
253
- related_model_fullname = manager_type_info .metadata ["django" ]["related_manager_to_model" ]
254
- assert isinstance (related_model_fullname , str )
255
- model_info = helpers .lookup_fully_qualified_typeinfo (api , related_model_fullname )
256
- if model_info is None :
257
- return None
258
-
259
- # We should _always_ have a '_default_manager' on a model
260
- assert "_default_manager" in model_info .names
261
- assert isinstance (model_info .names ["_default_manager" ].node , Var )
262
- manager_instance = model_info .names ["_default_manager" ].node .type
263
- return (
264
- get_method_type_from_dynamic_manager (api , method_name , manager_instance )
265
- # TODO: Can we assert on None and Instance?
266
- if manager_instance is not None and isinstance (manager_instance , Instance )
267
- else None
268
- )
269
-
270
-
271
239
def resolve_manager_method_from_instance (instance : Instance , method_name : str , ctx : AttributeContext ) -> MypyType :
272
240
api = helpers .get_typechecker_api (ctx )
273
- method_type = get_method_type_from_dynamic_manager (
274
- api , method_name , instance
275
- ) or get_method_type_from_reverse_manager (api , method_name , instance .type )
276
-
241
+ method_type = get_method_type_from_dynamic_manager (api , method_name , instance )
277
242
return method_type if method_type is not None else ctx .default_attr_type
278
243
279
244
0 commit comments