Skip to content

Commit aa98be2

Browse files
fix: prefetch_related_objects requires Sequence not Iterable (#2970)
* fix: `prefetch_related_objects` requires `Sequence` not `Iterable` Signed-off-by: Emmanuel Ferdman <[email protected]> * fix: `prefetch_related_objects` requires `Sequence` not `Iterable` Signed-off-by: Emmanuel Ferdman <[email protected]> * fix: `prefetch_related_objects` requires `Sequence` not `Iterable` Signed-off-by: Emmanuel Ferdman <[email protected]> * fix: `prefetch_related_objects` requires `Sequence` not `Iterable` Signed-off-by: Emmanuel Ferdman <[email protected]> --------- Signed-off-by: Emmanuel Ferdman <[email protected]>
1 parent cc934a7 commit aa98be2

File tree

2 files changed

+35
-2
lines changed

2 files changed

+35
-2
lines changed

django-stubs/db/models/query.pyi

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -285,8 +285,8 @@ class Prefetch(Generic[_LookupT, _PrefetchedQuerySetT, _ToAttrT]):
285285
def get_current_queryset(self, level: int) -> _PrefetchedQuerySetT | None: ...
286286
def get_current_querysets(self, level: int) -> list[_PrefetchedQuerySetT] | None: ...
287287

288-
def prefetch_related_objects(model_instances: Iterable[_Model], *related_lookups: str | Prefetch) -> None: ...
289-
async def aprefetch_related_objects(model_instances: Iterable[_Model], *related_lookups: str | Prefetch) -> None: ...
288+
def prefetch_related_objects(model_instances: Sequence[_Model], *related_lookups: str | Prefetch) -> None: ...
289+
async def aprefetch_related_objects(model_instances: Sequence[_Model], *related_lookups: str | Prefetch) -> None: ...
290290
def get_prefetcher(instance: Model, through_attr: str, to_attr: str) -> tuple[Any, Any, bool, bool]: ...
291291

292292
class InstanceCheckMeta(type): ...
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
from collections.abc import Sequence
2+
3+
from django.db.models import Model
4+
from django.db.models.query import (
5+
aprefetch_related_objects, # pyright: ignore[reportUnknownVariableType]
6+
prefetch_related_objects, # pyright: ignore[reportUnknownVariableType]
7+
)
8+
9+
models_list: list[Model] = []
10+
prefetch_related_objects(models_list, "pk")
11+
12+
models_tuple: tuple[Model, ...] = ()
13+
prefetch_related_objects(models_tuple, "pk")
14+
15+
models_sequence: Sequence[Model] = []
16+
prefetch_related_objects(models_sequence, "pk")
17+
18+
# failure cases
19+
models_set: set[Model] = set()
20+
prefetch_related_objects(models_set, "pk") # type: ignore[arg-type] # pyright: ignore[reportArgumentType] # pyrefly: ignore[bad-argument-type]
21+
22+
models_frozenset: frozenset[Model] = frozenset()
23+
prefetch_related_objects(models_frozenset, "pk") # type: ignore[arg-type] # pyright: ignore[reportArgumentType] # pyrefly: ignore[bad-argument-type]
24+
25+
26+
async def test_async() -> None:
27+
await aprefetch_related_objects(models_list, "pk")
28+
await aprefetch_related_objects(models_tuple, "pk")
29+
await aprefetch_related_objects(models_sequence, "pk")
30+
31+
# failure cases
32+
await aprefetch_related_objects(models_set, "pk") # type: ignore[arg-type] # pyright: ignore[reportArgumentType] # pyrefly: ignore[bad-argument-type]
33+
await aprefetch_related_objects(models_frozenset, "pk") # type: ignore[arg-type] # pyright: ignore[reportArgumentType] # pyrefly: ignore[bad-argument-type]

0 commit comments

Comments
 (0)