From 14ff5ad7a8297b5975e079a230f519d75d7bcc4d Mon Sep 17 00:00:00 2001 From: Thibaut Decombe <68703331+UnknownPlatypus@users.noreply.github.com> Date: Wed, 19 Oct 2022 10:14:51 +0200 Subject: [PATCH] Fix `RelatedManager` not callable (#1191) * Add failing test * Add call annotation --- django-stubs/db/models/manager.pyi | 1 + tests/typecheck/fields/test_related.yml | 20 ++++++++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/django-stubs/db/models/manager.pyi b/django-stubs/db/models/manager.pyi index 2ded943..8f0291c 100644 --- a/django-stubs/db/models/manager.pyi +++ b/django-stubs/db/models/manager.pyi @@ -172,6 +172,7 @@ class RelatedManager(Manager[_T]): self, objs: Union[QuerySet[_T], Iterable[Union[_T, int]]], *, bulk: bool = ..., clear: bool = ... ) -> None: ... def clear(self) -> None: ... + def __call__(self, *, manager: str) -> RelatedManager[_T]: ... class ManagerDescriptor: manager: BaseManager = ... diff --git a/tests/typecheck/fields/test_related.yml b/tests/typecheck/fields/test_related.yml index 60cc66e..df6c7ce 100644 --- a/tests/typecheck/fields/test_related.yml +++ b/tests/typecheck/fields/test_related.yml @@ -908,3 +908,23 @@ from django.db import models T = TypeVar("T", bound=models.Model) ManyToManyFieldAlias = Union["models.ManyToManyField[Sequence[T], models.manager.RelatedManager[T]]"] + +- case: callable_reverse_manager + main: | + from myapp.models import SalesMan + sales_man = SalesMan() + reveal_type(sales_man.client) # N: Revealed type is "django.db.models.manager.RelatedManager[myapp.models.CustomUser]" + reveal_type(sales_man.client(manager="staffs")) # N: Revealed type is "django.db.models.manager.RelatedManager[myapp.models.CustomUser]" + installed_apps: + - myapp + files: + - path: myapp/__init__.py + - path: myapp/models.py + content: | + from django.db import models + + class CustomUser(models.Model): + staffs = models.Manager() + + class SalesMan(models.Model): + client = models.ManyToManyField(CustomUser)