diff --git a/django-stubs/db/models/base.pyi b/django-stubs/db/models/base.pyi index d088a8d..b92ca53 100644 --- a/django-stubs/db/models/base.pyi +++ b/django-stubs/db/models/base.pyi @@ -7,6 +7,13 @@ from django.db.models.options import Options _Self = TypeVar("_Self", bound="Model") +class ModelStateFieldsCacheDescriptor: ... + +class ModelState: + db: Optional[str] = ... + adding: bool = ... + fields_cache: ModelStateFieldsCacheDescriptor = ... + class ModelBase(type): ... class Model(metaclass=ModelBase): @@ -17,7 +24,10 @@ class Model(metaclass=ModelBase): _default_manager: BaseManager[Model] objects: BaseManager[Any] pk: Any = ... + _state: ModelState def __init__(self: _Self, *args, **kwargs) -> None: ... + @classmethod + def from_db(cls, db: Optional[str], field_names: Collection[str], values: Collection[Any]) -> _Self: ... def delete(self, using: Any = ..., keep_parents: bool = ...) -> Tuple[int, Dict[str, int]]: ... def full_clean(self, exclude: Optional[Collection[str]] = ..., validate_unique: bool = ...) -> None: ... def clean(self) -> None: ... @@ -46,10 +56,3 @@ class Model(metaclass=ModelBase): @classmethod def check(cls, **kwargs: Any) -> List[CheckMessage]: ... def __getstate__(self) -> dict: ... - -class ModelStateFieldsCacheDescriptor: ... - -class ModelState: - db: None = ... - adding: bool = ... - fields_cache: ModelStateFieldsCacheDescriptor = ... diff --git a/test-data/typecheck/models/test_state.yml b/test-data/typecheck/models/test_state.yml new file mode 100644 index 0000000..c7dd4b8 --- /dev/null +++ b/test-data/typecheck/models/test_state.yml @@ -0,0 +1,14 @@ +- case: state_attribute_has_a_type_of_model_state + main: | + from myapp.models import MyUser + user = MyUser(pk=1) + reveal_type(user._state) # N: Revealed type is 'django.db.models.base.ModelState' + installed_apps: + - myapp + files: + - path: myapp/__init__.py + - path: myapp/models.py + content: | + from django.db import models + class MyUser(models.Model): + pass