|
1 | 1 | - case: self_return_management |
2 | 2 | main: | |
3 | | - from myapp.models import MyModel |
4 | | - reveal_type(MyModel.objects.example_simple()) # N: Revealed type is "myapp.models.ManagerFromMyQuerySet[myapp.models.MyModel]" |
5 | | - reveal_type(MyModel.objects.example_list()) # N: Revealed type is "builtins.list[myapp.models.ManagerFromMyQuerySet[myapp.models.MyModel]]" |
| 3 | + from myapp.models import MyModel, MyModelWithoutSelf |
| 4 | + reveal_type(MyModel.objects.example_simple()) # N: Revealed type is "myapp.models.MyQuerySet[myapp.models.MyModel]" |
| 5 | + reveal_type(MyModel.objects.example_list()) # N: Revealed type is "builtins.list[myapp.models.MyQuerySet[myapp.models.MyModel]]" |
6 | 6 | reveal_type(MyModel.objects.example_simple().just_int()) # N: Revealed type is "builtins.int" |
7 | | - reveal_type(MyModel.objects.example_dict()) # N: Revealed type is "builtins.dict[builtins.str, myapp.models.ManagerFromMyQuerySet[myapp.models.MyModel]]" |
| 7 | + reveal_type(MyModel.objects.example_dict()) # N: Revealed type is "builtins.dict[builtins.str, myapp.models.MyQuerySet[myapp.models.MyModel]]" |
| 8 | + reveal_type(MyModelWithoutSelf.objects.method()) # N: Revealed type is "myapp.models.QuerySetWithoutSelf" |
8 | 9 |
|
9 | 10 | installed_apps: |
10 | 11 | - myapp |
|
26 | 27 |
|
27 | 28 | class MyModel(models.Model): |
28 | 29 | objects = MyQuerySet.as_manager() |
| 30 | +
|
| 31 | + class QuerySetWithoutSelf(models.QuerySet["MyModelWithoutSelf"]): |
| 32 | + def method(self) -> "QuerySetWithoutSelf": |
| 33 | + return self |
| 34 | +
|
| 35 | + class MyModelWithoutSelf(models.Model): |
| 36 | + objects = QuerySetWithoutSelf.as_manager() |
29 | 37 | - case: declares_manager_type_like_django |
30 | 38 | main: | |
31 | 39 | from myapp.models import MyModel |
|
192 | 200 | reveal_type(MyOtherModel.objects.dummy_override()) # N: Revealed type is "myapp.models.MyOtherModel" |
193 | 201 | reveal_type(MyOtherModel.objects.example_mixin(MyOtherModel())) # N: Revealed type is "myapp.models.MyOtherModel" |
194 | 202 | reveal_type(MyOtherModel.objects.example_other_mixin()) # N: Revealed type is "myapp.models.MyOtherModel" |
| 203 | + reveal_type(MyOtherModel.objects.test_self()) # N: Revealed type is "myapp.models._MyModelQuerySet2[myapp.models.MyOtherModel]" |
| 204 | + reveal_type(MyOtherModel.objects.test_sub_self()) # N: Revealed type is "myapp.models._MyModelQuerySet2[myapp.models.MyOtherModel]" |
195 | 205 | installed_apps: |
196 | 206 | - myapp |
197 | 207 | files: |
|
200 | 210 | content: | |
201 | 211 | from typing import TypeVar, Generic |
202 | 212 | from django.db import models |
| 213 | + from typing_extensions import Self |
203 | 214 |
|
204 | 215 | T = TypeVar("T", bound=models.Model) |
205 | 216 | T_2 = TypeVar("T_2", bound=models.Model) |
|
215 | 226 | def override(self) -> T: ... |
216 | 227 | def override2(self) -> T: ... |
217 | 228 | def dummy_override(self) -> int: ... |
| 229 | + def test_sub_self(self) -> Self: ... |
218 | 230 |
|
219 | 231 | class _MyModelQuerySet2(SomeMixin, _MyModelQuerySet[T_2]): |
220 | 232 | def example_2(self) -> T_2: ... |
221 | 233 | def override(self) -> T_2: ... |
222 | 234 | def override2(self) -> T_2: ... |
223 | 235 | def dummy_override(self) -> T_2: ... # type: ignore[override] |
| 236 | + def test_self(self) -> Self: ... |
224 | 237 |
|
225 | 238 | class MyModelQuerySet(_MyModelQuerySet2["MyModel"]): |
226 | 239 | def override(self) -> "MyModel": ... |
|
0 commit comments