11from collections .abc import Iterable
2- from typing import Any , ClassVar , Literal , TypeVar
2+ from typing import Any , ClassVar , Literal , TypeVar , type_check_only
33
44from django .contrib .auth .base_user import AbstractBaseUser as AbstractBaseUser
55from django .contrib .auth .base_user import BaseUserManager as BaseUserManager
@@ -8,6 +8,7 @@ from django.contrib.contenttypes.models import ContentType
88from django .db import models
99from django .db .models import QuerySet
1010from django .db .models .base import Model
11+ from django .db .models .expressions import Combinable
1112from django .db .models .manager import EmptyManager
1213from django .utils .functional import _StrOrPromise
1314from typing_extensions import Self , TypeAlias
@@ -20,22 +21,40 @@ class PermissionManager(models.Manager[Permission]):
2021 def get_by_natural_key (self , codename : str , app_label : str , model : str ) -> Permission : ...
2122
2223class Permission (models .Model ):
23- content_type_id : int
2424 objects : ClassVar [PermissionManager ]
2525
26+ id : models .AutoField
27+ pk : models .AutoField
2628 name = models .CharField (max_length = 255 )
27- content_type = models .ForeignKey (ContentType , on_delete = models .CASCADE )
29+ content_type = models .ForeignKey [ContentType | Combinable , ContentType ](ContentType , on_delete = models .CASCADE )
30+ content_type_id : int
2831 codename = models .CharField (max_length = 100 )
32+ group_set : models .ManyToManyField [Group , Group_permissions ]
2933 def natural_key (self ) -> tuple [str , str , str ]: ...
3034
3135class GroupManager (models .Manager [Group ]):
3236 def get_by_natural_key (self , name : str ) -> Group : ...
3337
38+ # This is a model that only exists in Django's model registry and doesn't have any
39+ # class statement form. It's the through model between 'Group' and 'Permission'.
40+ @type_check_only
41+ class Group_permissions (models .Model ):
42+ objects : ClassVar [models .Manager [Self ]]
43+
44+ id : models .AutoField
45+ pk : models .AutoField
46+ group : models .ForeignKey [Group | Combinable , Group ]
47+ group_id : int
48+ permission : models .ForeignKey [Permission | Combinable , Permission ]
49+ permission_id : int
50+
3451class Group (models .Model ):
3552 objects : ClassVar [GroupManager ]
3653
54+ id : models .AutoField
55+ pk : models .AutoField
3756 name = models .CharField (max_length = 150 )
38- permissions = models .ManyToManyField (Permission )
57+ permissions = models .ManyToManyField [ Permission , Group_permissions ] (Permission )
3958 def natural_key (self ) -> tuple [str ]: ...
4059
4160_T = TypeVar ("_T" , bound = Model )
@@ -90,7 +109,9 @@ class AbstractUser(AbstractBaseUser, PermissionsMixin):
90109 self , subject : _StrOrPromise , message : _StrOrPromise , from_email : str = ..., ** kwargs : Any
91110 ) -> None : ...
92111
93- class User (AbstractUser ): ...
112+ class User (AbstractUser ):
113+ id : models .AutoField
114+ pk : models .AutoField
94115
95116class AnonymousUser :
96117 id : None
0 commit comments