1from typing import Any, Callable, Dict, Iterable, List, Optional, Sequence, Tuple, Type, TypeVar, Union, overload
2from uuid import UUID
3
4from django.db import models
5from django.db.models.base import Model
6from django.db.models.fields import Field
7from django.db.models.query_utils import Q, PathInfo
8from django.db.models.manager import RelatedManager
9from django.db.models.expressions import Combinable
10from django.db.models.fields.mixins import FieldCacheMixin
11from django.db.models.fields.related_descriptors import (  # noqa: F401
12    ForwardOneToOneDescriptor as ForwardOneToOneDescriptor,
13    ForwardManyToOneDescriptor as ForwardManyToOneDescriptor,
14    ManyToManyDescriptor as ManyToManyDescriptor,
15    ReverseOneToOneDescriptor as ReverseOneToOneDescriptor,
16    ReverseManyToOneDescriptor as ReverseManyToOneDescriptor,
17)
18from django.db.models.fields.reverse_related import (  # noqa: F401
19    ForeignObjectRel as ForeignObjectRel,
20    OneToOneRel as OneToOneRel,
21    ManyToOneRel as ManyToOneRel,
22    ManyToManyRel as ManyToManyRel,
23)
24
25_T = TypeVar("_T", bound=models.Model)
26_F = TypeVar("_F", bound=models.Field)
27_Choice = Tuple[Any, str]
28_ChoiceNamedGroup = Tuple[str, Iterable[_Choice]]
29_FieldChoices = Iterable[Union[_Choice, _ChoiceNamedGroup]]
30
31_ValidatorCallable = Callable[..., None]
32_ErrorMessagesToOverride = Dict[str, Any]
33
34RECURSIVE_RELATIONSHIP_CONSTANT: str = ...
35
36# __set__ value type
37_ST = TypeVar("_ST")
38# __get__ return type
39_GT = TypeVar("_GT")
40
41class RelatedField(FieldCacheMixin, Field[_ST, _GT]):
42    one_to_many: bool = ...
43    one_to_one: bool = ...
44    many_to_many: bool = ...
45    many_to_one: bool = ...
46    related_model: Type[Model]
47    opts: Any = ...
48    def get_forward_related_filter(self, obj: Model) -> Dict[str, Union[int, UUID]]: ...
49    def get_reverse_related_filter(self, obj: Model) -> Q: ...
50    @property
51    def swappable_setting(self) -> Optional[str]: ...
52    def set_attributes_from_rel(self) -> None: ...
53    def do_related_class(self, other: Type[Model], cls: Type[Model]) -> None: ...
54    def get_limit_choices_to(self) -> Dict[str, int]: ...
55    def related_query_name(self) -> str: ...
56    @property
57    def target_field(self) -> Field: ...
58
59class ForeignObject(RelatedField[_ST, _GT]):
60    def __init__(
61        self,
62        to: Union[Type[Model], str],
63        on_delete: Callable[..., None],
64        from_fields: Sequence[str],
65        to_fields: Sequence[str],
66        rel: Optional[ForeignObjectRel] = ...,
67        related_name: Optional[str] = ...,
68        related_query_name: Optional[str] = ...,
69        limit_choices_to: Optional[Union[Dict[str, Any], Callable[[], Any]]] = ...,
70        parent_link: bool = ...,
71        db_constraint: bool = ...,
72        swappable: bool = ...,
73        verbose_name: Optional[str] = ...,
74        name: Optional[str] = ...,
75        primary_key: bool = ...,
76        unique: bool = ...,
77        blank: bool = ...,
78        null: bool = ...,
79        db_index: bool = ...,
80        default: Any = ...,
81        editable: bool = ...,
82        auto_created: bool = ...,
83        serialize: bool = ...,
84        choices: Optional[_FieldChoices] = ...,
85        help_text: str = ...,
86        db_column: Optional[str] = ...,
87        db_tablespace: Optional[str] = ...,
88        validators: Iterable[_ValidatorCallable] = ...,
89        error_messages: Optional[_ErrorMessagesToOverride] = ...,
90    ): ...
91
92class ForeignKey(ForeignObject[_ST, _GT]):
93    _pyi_private_set_type: Union[Any, Combinable]
94    _pyi_private_get_type: Any
95    def __init__(
96        self,
97        to: Union[Type[Model], str],
98        on_delete: Callable[..., None],
99        to_field: Optional[str] = ...,
100        related_name: Optional[str] = ...,
101        related_query_name: Optional[str] = ...,
102        limit_choices_to: Optional[Union[Dict[str, Any], Callable[[], Any], Q]] = ...,
103        parent_link: bool = ...,
104        db_constraint: bool = ...,
105        verbose_name: Optional[Union[str, bytes]] = ...,
106        name: Optional[str] = ...,
107        primary_key: bool = ...,
108        max_length: Optional[int] = ...,
109        unique: bool = ...,
110        blank: bool = ...,
111        null: bool = ...,
112        db_index: bool = ...,
113        default: Any = ...,
114        editable: bool = ...,
115        auto_created: bool = ...,
116        serialize: bool = ...,
117        unique_for_date: Optional[str] = ...,
118        unique_for_month: Optional[str] = ...,
119        unique_for_year: Optional[str] = ...,
120        choices: Optional[_FieldChoices] = ...,
121        help_text: str = ...,
122        db_column: Optional[str] = ...,
123        db_tablespace: Optional[str] = ...,
124        validators: Iterable[_ValidatorCallable] = ...,
125        error_messages: Optional[_ErrorMessagesToOverride] = ...,
126    ): ...
127    # class access
128    @overload  # type: ignore
129    def __get__(self, instance: None, owner) -> ForwardManyToOneDescriptor: ...
130    # Model instance access
131    @overload
132    def __get__(self, instance: Model, owner) -> _GT: ...
133    # non-Model instances
134    @overload
135    def __get__(self: _F, instance, owner) -> _F: ...
136
137class OneToOneField(RelatedField[_ST, _GT]):
138    _pyi_private_set_type: Union[Any, Combinable]
139    _pyi_private_get_type: Any
140    def __init__(
141        self,
142        to: Union[Type[Model], str],
143        on_delete: Any,
144        to_field: Optional[str] = ...,
145        related_name: Optional[str] = ...,
146        related_query_name: Optional[str] = ...,
147        limit_choices_to: Optional[Union[Dict[str, Any], Callable[[], Any], Q]] = ...,
148        parent_link: bool = ...,
149        db_constraint: bool = ...,
150        verbose_name: Optional[Union[str, bytes]] = ...,
151        name: Optional[str] = ...,
152        primary_key: bool = ...,
153        max_length: Optional[int] = ...,
154        unique: bool = ...,
155        blank: bool = ...,
156        null: bool = ...,
157        db_index: bool = ...,
158        default: Any = ...,
159        editable: bool = ...,
160        auto_created: bool = ...,
161        serialize: bool = ...,
162        unique_for_date: Optional[str] = ...,
163        unique_for_month: Optional[str] = ...,
164        unique_for_year: Optional[str] = ...,
165        choices: Optional[_FieldChoices] = ...,
166        help_text: str = ...,
167        db_column: Optional[str] = ...,
168        db_tablespace: Optional[str] = ...,
169        validators: Iterable[_ValidatorCallable] = ...,
170        error_messages: Optional[_ErrorMessagesToOverride] = ...,
171    ): ...
172    # class access
173    @overload  # type: ignore
174    def __get__(self, instance: None, owner) -> ForwardOneToOneDescriptor: ...
175    # Model instance access
176    @overload
177    def __get__(self, instance: Model, owner) -> _GT: ...
178    # non-Model instances
179    @overload
180    def __get__(self: _F, instance, owner) -> _F: ...
181
182class ManyToManyField(RelatedField[_ST, _GT]):
183    _pyi_private_set_type: Sequence[Any]
184    _pyi_private_get_type: RelatedManager[Any]
185
186    rel_class: Any = ...
187    description: Any = ...
188    has_null_arg: Any = ...
189    swappable: bool = ...
190    def __init__(
191        self,
192        to: Union[Type[_T], str],
193        related_name: Optional[str] = ...,
194        related_query_name: Optional[str] = ...,
195        limit_choices_to: Optional[Union[Dict[str, Any], Callable[[], Any], Q]] = ...,
196        symmetrical: Optional[bool] = ...,
197        through: Optional[Union[str, Type[Model]]] = ...,
198        through_fields: Optional[Tuple[str, str]] = ...,
199        db_constraint: bool = ...,
200        db_table: Optional[str] = ...,
201        swappable: bool = ...,
202        verbose_name: Optional[Union[str, bytes]] = ...,
203        name: Optional[str] = ...,
204        primary_key: bool = ...,
205        max_length: Optional[int] = ...,
206        unique: bool = ...,
207        blank: bool = ...,
208        null: bool = ...,
209        db_index: bool = ...,
210        default: Any = ...,
211        editable: bool = ...,
212        auto_created: bool = ...,
213        serialize: bool = ...,
214        unique_for_date: Optional[str] = ...,
215        unique_for_month: Optional[str] = ...,
216        unique_for_year: Optional[str] = ...,
217        choices: Optional[_FieldChoices] = ...,
218        help_text: str = ...,
219        db_column: Optional[str] = ...,
220        db_tablespace: Optional[str] = ...,
221        validators: Iterable[_ValidatorCallable] = ...,
222        error_messages: Optional[_ErrorMessagesToOverride] = ...,
223    ) -> None: ...
224    # class access
225    @overload  # type: ignore
226    def __get__(self, instance: None, owner) -> ManyToManyDescriptor: ...
227    # Model instance access
228    @overload
229    def __get__(self, instance: Model, owner) -> _GT: ...
230    # non-Model instances
231    @overload
232    def __get__(self: _F, instance, owner) -> _F: ...
233    def get_path_info(self, filtered_relation: None = ...) -> List[PathInfo]: ...
234    def get_reverse_path_info(self, filtered_relation: None = ...) -> List[PathInfo]: ...
235    def contribute_to_related_class(self, cls: Type[Model], related: RelatedField) -> None: ...
236    def m2m_db_table(self) -> str: ...
237    def m2m_column_name(self) -> str: ...
238    def m2m_reverse_name(self) -> str: ...
239    def m2m_reverse_field_name(self) -> str: ...
240    def m2m_target_field_name(self) -> str: ...
241    def m2m_reverse_target_field_name(self) -> str: ...
242
243def create_many_to_many_intermediary_model(field: Type[Field], klass: Type[Model]) -> Type[Model]: ...
244