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)