Skip to content

Commit 1b8c1b5

Browse files
author
joshua-jandyco
authored
Add django.db.models.query.BaseIterable and subclasses (#1242)
Closes #1237.
1 parent a0e98a2 commit 1b8c1b5

File tree

2 files changed

+76
-0
lines changed

2 files changed

+76
-0
lines changed

django-stubs/db/models/query.pyi

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ from typing import (
99
Iterator,
1010
List,
1111
MutableMapping,
12+
NamedTuple,
1213
Optional,
1314
Reversible,
1415
Sequence,
@@ -30,13 +31,39 @@ from django.db.models.sql.query import Query, RawQuery
3031
_T = TypeVar("_T", bound=Model, covariant=True)
3132
_Row = TypeVar("_Row", covariant=True)
3233
_QS = TypeVar("_QS", bound="_QuerySet")
34+
_TupleT = TypeVar("_TupleT", bound=tuple[Any, ...], covariant=True)
3335

3436
MAX_GET_RESULTS: int = ...
3537
REPR_OUTPUT_SIZE: int = ...
3638

39+
class BaseIterable(Generic[_Row]):
40+
queryset: QuerySet[Model]
41+
chunked_fetch: bool
42+
chunk_size: int
43+
def __init__(self, queryset: QuerySet[Model], chunked_fetch: bool = ..., chunk_size: int = ...) -> None: ...
44+
45+
class ModelIterable(Generic[_T], BaseIterable[_T]):
46+
def __iter__(self) -> Iterator[_T]: ...
47+
48+
class RawModelIterable(BaseIterable[dict[str, Any]]):
49+
def __iter__(self) -> Iterator[dict[str, Any]]: ...
50+
51+
class ValuesIterable(BaseIterable[dict[str, Any]]):
52+
def __iter__(self) -> Iterator[dict[str, Any]]: ...
53+
54+
class ValuesListIterable(BaseIterable[_TupleT]):
55+
def __iter__(self) -> Iterator[_TupleT]: ...
56+
57+
class NamedValuesListIterable(ValuesListIterable[NamedTuple]):
58+
def __iter__(self) -> Iterator[NamedTuple]: ...
59+
60+
class FlatValuesListIterable(BaseIterable[_Row]):
61+
def __iter__(self) -> Iterator[_Row]: ...
62+
3763
class _QuerySet(Generic[_T, _Row], Collection[_Row], Reversible[_Row], Sized):
3864
model: Type[_T]
3965
query: Query
66+
_iterable_class: Type[BaseIterable]
4067
def __init__(
4168
self,
4269
model: Optional[Type[Model]] = ...,
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
- case: django_db_models_query_module_has_ModelIterable
2+
main: |
3+
from django.db.models.query import ModelIterable
4+
from django.db.models import Model
5+
6+
class IntModelIterable(ModelIterable[int]):
7+
pass
8+
9+
class NoTypeParameterModelIterable(ModelIterable):
10+
pass
11+
12+
class ModelModelIterable(ModelIterable[Model]):
13+
pass
14+
15+
class MyModel(Model):
16+
pass
17+
18+
class MyModelModelIterable(ModelIterable[MyModel]):
19+
pass
20+
out: |
21+
main:4: error: Type argument "int" of "ModelIterable" must be a subtype of "Model"
22+
- case: django_db_models_query_module_has_ValuesListIterable
23+
main: |
24+
from django.db.models.query import ValuesListIterable
25+
26+
class IntValuesListIterable(ValuesListIterable[tuple[int,int]]):
27+
pass
28+
class StringsValuesListIterable(ValuesListIterable[tuple[str,str,str]]):
29+
pass
30+
class MultiTypeValuesListIterable(ValuesListIterable[tuple[str,int,float]]):
31+
pass
32+
33+
class NonTupleValuesListIterable(ValuesListIterable[int]):
34+
pass
35+
out: |
36+
main:10: error: Type argument "int" of "ValuesListIterable" must be a subtype of "Tuple[Any, ...]"
37+
- case: django_db_models_query_module_has_NamedValuesListIterable
38+
main: |
39+
from django.db.models.query import NamedValuesListIterable
40+
out: |
41+
- case: QuerySet_has__iterable_class_defined
42+
main: |
43+
from django.db.models.query import QuerySet, ValuesIterable, ModelIterable
44+
iterable_class = QuerySet._iterable_class
45+
QuerySet._iterable_class = ValuesIterable
46+
QuerySet._iterable_class = ModelIterable
47+
QuerySet._iterable_class = int
48+
out: |
49+
main:5: error: Incompatible types in assignment (expression has type "Type[int]", variable has type "Type[BaseIterable[Any]]")

0 commit comments

Comments
 (0)