|
438 | 438 | - case: test_queryset_in_model_class_body
|
439 | 439 | main: |
|
440 | 440 | from myapp.models import MyModel
|
441 |
| - reveal_type(MyModel.objects) # N: Revealed type is "myapp.models.MyManagerFromMyQuerySet[myapp.models.MyModel]" |
442 |
| - reveal_type(MyModel._default_manager) # N: Revealed type is "myapp.models.MyManagerFromMyQuerySet[myapp.models.MyModel]" |
443 |
| - reveal_type(MyModel.objects.all) # N: Revealed type is "def () -> myapp.models.MyQuerySet[myapp.models.MyModel]" |
| 441 | + reveal_type(MyModel.objects) # N: Revealed type is "myapp.models.MyManagerFromMyQuerySet" |
| 442 | + reveal_type(MyModel._default_manager) # N: Revealed type is "myapp.models.MyManagerFromMyQuerySet" |
| 443 | + reveal_type(MyModel.objects.all) # N: Revealed type is "def () -> myapp.models.MyQuerySet" |
444 | 444 | reveal_type(MyModel.objects.custom) # N: Revealed type is "def () -> myapp.models.MyQuerySet"
|
445 |
| - reveal_type(MyModel.objects.all().filter) # N: Revealed type is "def (*args: Any, **kwargs: Any) -> myapp.models.MyQuerySet[myapp.models.MyModel]" |
| 445 | + reveal_type(MyModel.objects.all().filter) # N: Revealed type is "def (*args: Any, **kwargs: Any) -> myapp.models.MyQuerySet" |
446 | 446 | reveal_type(MyModel.objects.custom().filter) # N: Revealed type is "def (*args: Any, **kwargs: Any) -> myapp.models.MyQuerySet"
|
447 |
| - reveal_type(MyModel.objects2) # N: Revealed type is "myapp.models.MyManagerFromMyQuerySet[myapp.models.MyModel]" |
448 |
| - reveal_type(MyModel._default_manager) # N: Revealed type is "myapp.models.MyManagerFromMyQuerySet[myapp.models.MyModel]" |
| 447 | + reveal_type(MyModel.objects2) # N: Revealed type is "myapp.models.MyManagerFromMyQuerySet" |
| 448 | + reveal_type(MyModel._default_manager) # N: Revealed type is "myapp.models.MyManagerFromMyQuerySet" |
449 | 449 | installed_apps:
|
450 | 450 | - myapp
|
451 | 451 | files:
|
|
468 | 468 | - case: test_queryset_in_model_class_body_subclass
|
469 | 469 | main: |
|
470 | 470 | from myapp.models import MyModel
|
471 |
| - reveal_type(MyModel.objects) # N: Revealed type is "myapp.models.BaseManagerFromBaseQuerySet[myapp.models.MyModel]" |
| 471 | + reveal_type(MyModel.objects) # N: Revealed type is "myapp.models.BaseManagerFromBaseQuerySet" |
472 | 472 | installed_apps:
|
473 | 473 | - myapp
|
474 | 474 | files:
|
|
675 | 675 | ...
|
676 | 676 |
|
677 | 677 | StrCallable = BaseManager.from_queryset(ModelQuerySet, class_name=str(1))
|
| 678 | +
|
| 679 | +- case: only_auto_populates_model_arg_to_manager_with_type_var |
| 680 | + main: | |
| 681 | + from myapp.models import MyModel |
| 682 | + reveal_type(MyModel.bm_populated_from_qs_populated) |
| 683 | + reveal_type(MyModel.bm_generic_from_qs_populated) |
| 684 | +
|
| 685 | + reveal_type(MyModel.bm_populated_from_qs_generic) |
| 686 | + reveal_type(MyModel.bm_generic_from_qs_generic) |
| 687 | +
|
| 688 | + reveal_type(MyModel.m_populated_from_qs_populated) |
| 689 | + reveal_type(MyModel.m_generic_from_qs_populated) |
| 690 | +
|
| 691 | + reveal_type(MyModel.m_populated_from_qs_generic) |
| 692 | + reveal_type(MyModel.m_generic_from_qs_generic) |
| 693 | +
|
| 694 | + reveal_type(MyModel.qs_populated_as_manager) |
| 695 | + reveal_type(MyModel.qs_generic_as_manager) |
| 696 | + out: | |
| 697 | + main:2: note: Revealed type is "myapp.models.BaseManagerPopulatedFromQuerySetPopulated" |
| 698 | + main:3: note: Revealed type is "myapp.models.BaseManagerGenericFromQuerySetPopulated[myapp.models.MyModel]" |
| 699 | + main:5: note: Revealed type is "myapp.models.BaseManagerPopulatedFromQuerySetGeneric" |
| 700 | + main:6: note: Revealed type is "myapp.models.BaseManagerGenericFromQuerySetGeneric[myapp.models.MyModel]" |
| 701 | + main:8: note: Revealed type is "myapp.models.ManagerPopulatedFromQuerySetPopulated" |
| 702 | + main:9: note: Revealed type is "myapp.models.ManagerGenericFromQuerySetPopulated[myapp.models.MyModel]" |
| 703 | + main:11: note: Revealed type is "myapp.models.ManagerPopulatedFromQuerySetGeneric" |
| 704 | + main:12: note: Revealed type is "myapp.models.ManagerGenericFromQuerySetGeneric[myapp.models.MyModel]" |
| 705 | + main:14: note: Revealed type is "myapp.models.ManagerFromQuerySetPopulated[myapp.models.MyModel]" |
| 706 | + # TODO: We want a line like below and not an error.. But mypy doesn't trigger |
| 707 | + # the dynamic class hook for classes with generic arguments.. |
| 708 | + # Revealed type is "myapp.models.ManagerFromQuerySetGeneric[myapp.models.MyModel]" |
| 709 | + main:15: note: Revealed type is "myapp.models.UnknownManager[myapp.models.MyModel]" |
| 710 | + myapp/models:50: error: Could not resolve manager type for "myapp.models.MyModel.qs_generic_as_manager" |
| 711 | + installed_apps: |
| 712 | + - myapp |
| 713 | + files: |
| 714 | + - path: myapp/__init__.py |
| 715 | + - path: myapp/models.py |
| 716 | + content: | |
| 717 | + from typing import TypeVar |
| 718 | + from django.db.models import Manager, Model, QuerySet |
| 719 | + from django.db.models.manager import BaseManager |
| 720 | +
|
| 721 | + class QuerySetPopulated(QuerySet["MyModel"]): |
| 722 | + ... |
| 723 | +
|
| 724 | + T = TypeVar("T", bound=Model) |
| 725 | + class QuerySetGeneric(QuerySet[T]): |
| 726 | + ... |
| 727 | +
|
| 728 | + class BaseManagerPopulated(BaseManager["MyModel"]): |
| 729 | + ... |
| 730 | +
|
| 731 | + class BaseManagerGeneric(BaseManager[T]): |
| 732 | + ... |
| 733 | +
|
| 734 | + class ManagerPopulated(Manager["MyModel"]): |
| 735 | + ... |
| 736 | +
|
| 737 | + class ManagerGeneric(Manager[T]): |
| 738 | + ... |
| 739 | +
|
| 740 | + BaseManagerPopulatedFromQuerySetPopulated = BaseManagerPopulated.from_queryset(QuerySetPopulated) |
| 741 | + BaseManagerGenericFromQuerySetPopulated = BaseManagerGeneric.from_queryset(QuerySetPopulated) |
| 742 | +
|
| 743 | + BaseManagerPopulatedFromQuerySetGeneric = BaseManagerPopulated.from_queryset(QuerySetGeneric) |
| 744 | + BaseManagerGenericFromQuerySetGeneric = BaseManagerGeneric.from_queryset(QuerySetGeneric) |
| 745 | +
|
| 746 | + ManagerPopulatedFromQuerySetPopulated = ManagerPopulated.from_queryset(QuerySetPopulated) |
| 747 | + ManagerGenericFromQuerySetPopulated = ManagerGeneric.from_queryset(QuerySetPopulated) |
| 748 | +
|
| 749 | + ManagerPopulatedFromQuerySetGeneric = ManagerPopulated.from_queryset(QuerySetGeneric) |
| 750 | + ManagerGenericFromQuerySetGeneric = ManagerGeneric.from_queryset(QuerySetGeneric) |
| 751 | +
|
| 752 | + class MyModel(Model): |
| 753 | + bm_populated_from_qs_populated = BaseManagerPopulatedFromQuerySetPopulated() |
| 754 | + bm_generic_from_qs_populated = BaseManagerGenericFromQuerySetPopulated() |
| 755 | +
|
| 756 | + bm_populated_from_qs_generic = BaseManagerPopulatedFromQuerySetGeneric() |
| 757 | + bm_generic_from_qs_generic = BaseManagerGenericFromQuerySetGeneric() |
| 758 | +
|
| 759 | + m_populated_from_qs_populated = ManagerPopulatedFromQuerySetPopulated() |
| 760 | + m_generic_from_qs_populated = ManagerGenericFromQuerySetPopulated() |
| 761 | +
|
| 762 | + m_populated_from_qs_generic = ManagerPopulatedFromQuerySetGeneric() |
| 763 | + m_generic_from_qs_generic = ManagerGenericFromQuerySetGeneric() |
| 764 | +
|
| 765 | + qs_populated_as_manager = QuerySetPopulated.as_manager() |
| 766 | + qs_generic_as_manager = QuerySetGeneric["MyModel"].as_manager() |
0 commit comments