From 5bb5304596463eb7985360e0f19041a066a8cbf3 Mon Sep 17 00:00:00 2001 From: Rob Percival Date: Mon, 18 Oct 2021 17:15:56 +0100 Subject: [PATCH] Make AddRelatedManagers look for "objects" on parent model Previously, AddRelatedManagers would fail if a related model had inherited its `objects` field from a parent class. This would result in missing relation attributes. This is fixed by using `get()` instead of `names`; the former searches the MRO for the symbol, whereas the latter only looks for symbols declared directly on the class. --- mypy_django_plugin/transformers/models.py | 5 +++-- tests/typecheck/fields/test_related.yml | 1 - 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/mypy_django_plugin/transformers/models.py b/mypy_django_plugin/transformers/models.py index 305ade90ac..73ccf9375c 100644 --- a/mypy_django_plugin/transformers/models.py +++ b/mypy_django_plugin/transformers/models.py @@ -273,7 +273,8 @@ def run_with_model_cls(self, model_cls: Type[Model]) -> None: related_manager_info = self.lookup_typeinfo_or_incomplete_defn_error( fullnames.RELATED_MANAGER_CLASS ) # noqa: E501 - if "objects" not in related_model_info.names: + objects = related_model_info.get("objects") + if not objects: raise helpers.IncompleteDefnException() except helpers.IncompleteDefnException as exc: if not self.api.final_iteration: @@ -283,7 +284,7 @@ def run_with_model_cls(self, model_cls: Type[Model]) -> None: # create new RelatedManager subclass parametrized_related_manager_type = Instance(related_manager_info, [Instance(related_model_info, [])]) - default_manager_type = related_model_info.names["objects"].type + default_manager_type = objects.type if default_manager_type is None: default_manager_type = self.try_generate_related_manager(related_model_cls, related_model_info) if ( diff --git a/tests/typecheck/fields/test_related.yml b/tests/typecheck/fields/test_related.yml index e08b68d605..b76a1c38d6 100644 --- a/tests/typecheck/fields/test_related.yml +++ b/tests/typecheck/fields/test_related.yml @@ -605,7 +605,6 @@ - case: test_foreign_key_from_superclass_inherits_correctly_when_also_inheriting_manager - expect_fail: yes main: | from myapp.models import MyUser, Book, Article, LibraryEntity reveal_type(Book().registered_by_user) # N: Revealed type is "myapp.models.MyUser*"