Skip to content

Commit d27aae4

Browse files
authored
Update Model._meta to ClassVar[Options[Self]] (#1732)
Also drop the plugin code populating the `Options` argument as it isn't needed.
1 parent 939f91c commit d27aae4

File tree

4 files changed

+31
-10
lines changed

4 files changed

+31
-10
lines changed

django-stubs/db/models/base.pyi

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ class Model(metaclass=ModelBase):
4141
objects: ClassVar[Manager[Self]]
4242

4343
class Meta: ...
44-
_meta: Options[Any]
44+
_meta: ClassVar[Options[Self]]
4545
pk: Any
4646
_state: ModelState
4747
def __init__(self, *args: Any, **kwargs: Any) -> None: ...

mypy_django_plugin/transformers/models.py

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -613,13 +613,6 @@ def run_with_model_cls(self, model_cls: Type[Model]) -> None:
613613
)
614614

615615

616-
class AddMetaOptionsAttribute(ModelClassInitializer):
617-
def run_with_model_cls(self, model_cls: Type[Model]) -> None:
618-
if "_meta" not in self.model_classdef.info.names:
619-
options_info = self.lookup_typeinfo_or_incomplete_defn_error(fullnames.OPTIONS_CLASS_FULLNAME)
620-
self.add_new_node_to_model_class("_meta", Instance(options_info, [Instance(self.model_classdef.info, [])]))
621-
622-
623616
class ProcessManyToManyFields(ModelClassInitializer):
624617
"""
625618
Processes 'ManyToManyField()' fields and generates any implicit through tables that
@@ -918,7 +911,6 @@ def process_model_class(ctx: ClassDefContext, django_context: DjangoContext) ->
918911
AddDefaultManagerAttribute,
919912
AddReverseLookups,
920913
AddExtraFieldMethods,
921-
AddMetaOptionsAttribute,
922914
ProcessManyToManyFields,
923915
MetaclassAdjustments,
924916
]

tests/typecheck/models/test_contrib_models.yml

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,3 +62,32 @@
6262
...
6363
class MyUser(AbstractUser):
6464
objects: ClassVar[MyUserManager] = MyUserManager()
65+
66+
- case: can_combine_permissions_mixin_and_abstract_base_user
67+
main: |
68+
from django.contrib.auth.base_user import AbstractBaseUser
69+
from django.contrib.auth.models import PermissionsMixin
70+
from myapp.models import AuthUser
71+
reveal_type(AuthUser._meta)
72+
reveal_type(AuthUser()._meta)
73+
reveal_type(PermissionsMixin._meta)
74+
reveal_type(AbstractBaseUser._meta)
75+
out: |
76+
main:4: note: Revealed type is "django.db.models.options.Options[myapp.models.AuthUser]"
77+
main:5: note: Revealed type is "django.db.models.options.Options[myapp.models.AuthUser]"
78+
main:6: note: Revealed type is "django.db.models.options.Options[django.contrib.auth.models.PermissionsMixin]"
79+
main:7: note: Revealed type is "django.db.models.options.Options[django.contrib.auth.base_user.AbstractBaseUser]"
80+
installed_apps:
81+
- django.contrib.auth
82+
- myapp
83+
files:
84+
- path: myapp/__init__.py
85+
- path: myapp/models.py
86+
content: |
87+
from django.contrib.auth.base_user import AbstractBaseUser
88+
from django.contrib.auth.models import PermissionsMixin
89+
90+
class AuthUser(AbstractBaseUser, PermissionsMixin):
91+
class Meta:
92+
abstract = False
93+
db_table = "auth_user"

tests/typecheck/models/test_meta_options.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@
4040
from myapp.models import AbstractModel
4141
class MyModel(AbstractModel):
4242
pass
43-
reveal_type(MyModel._meta.get_field('field')) # N: Revealed type is "Any"
43+
reveal_type(MyModel._meta.get_field('field')) # N: Revealed type is "Union[django.db.models.fields.Field[Any, Any], django.db.models.fields.reverse_related.ForeignObjectRel, django.contrib.contenttypes.fields.GenericForeignKey]"
4444
installed_apps:
4545
- myapp
4646
files:

0 commit comments

Comments
 (0)