Skip to content

Commit

Permalink
Make QuerySet non-generic.
Browse files Browse the repository at this point in the history
This also re-export QuerySetAlias for external access to
generic _QuerySet. We use this in our test cases as well.
The approach taken here is making `QuerySet` a subclass
of `_QuerySet[_T, _T]`, and make `_QuerySetAlias` a type
alias of `_QuerySet[_T, _T]`.

`_QuerySetAlias[_T]` should be used internally whenever
the type parameter is needed, replacing `QuerySet[_T]` entirely
within the stubs; both `QuerySet` and `_QuerySetAlias` are accepted
in use cases where the type parameter is not needed.

Signed-off-by: Zixuan James Li <p359101898@gmail.com>

Signed-off-by: Zixuan James Li <p359101898@gmail.com>
  • Loading branch information
PIG208 committed Oct 21, 2022
1 parent 36002a2 commit 31784dc
Show file tree
Hide file tree
Showing 28 changed files with 133 additions and 123 deletions.
6 changes: 4 additions & 2 deletions django-stubs/contrib/admin/actions.pyi
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
from typing import Optional

from django.contrib.admin.options import ModelAdmin
from django.db.models.query import QuerySet
from django.db.models.query import _QuerySetAlias
from django.http.request import HttpRequest
from django.template.response import TemplateResponse

def delete_selected(modeladmin: ModelAdmin, request: HttpRequest, queryset: QuerySet) -> Optional[TemplateResponse]: ...
def delete_selected(
modeladmin: ModelAdmin, request: HttpRequest, queryset: _QuerySetAlias
) -> Optional[TemplateResponse]: ...
5 changes: 3 additions & 2 deletions django-stubs/contrib/admin/decorators.pyi
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,16 @@ from typing import Any, Callable, Optional, Sequence, Type, TypeVar, Union

from django.contrib.admin import ModelAdmin
from django.contrib.admin.sites import AdminSite
from django.db.models import Combinable, QuerySet
from django.db.models import Combinable
from django.db.models.base import Model
from django.db.models.expressions import BaseExpression
from django.db.models.query import _QuerySetAlias
from django.http import HttpRequest

_ModelT = TypeVar("_ModelT", bound=Model)

def action(
function: Optional[Callable[[ModelAdmin, HttpRequest, QuerySet], None]] = ...,
function: Optional[Callable[[ModelAdmin, HttpRequest, _QuerySetAlias], None]] = ...,
*,
permissions: Optional[Sequence[str]] = ...,
description: Optional[str] = ...,
Expand Down
6 changes: 3 additions & 3 deletions django-stubs/contrib/admin/filters.pyi
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ from django.contrib.admin.options import ModelAdmin
from django.db.models.base import Model
from django.db.models.fields import Field
from django.db.models.fields.related import RelatedField
from django.db.models.query import QuerySet
from django.db.models.query import _QuerySetAlias
from django.http.request import HttpRequest

class ListFilter:
Expand All @@ -16,7 +16,7 @@ class ListFilter:
) -> None: ...
def has_output(self) -> bool: ...
def choices(self, changelist: Any) -> Iterator[Dict[str, Any]]: ...
def queryset(self, request: HttpRequest, queryset: QuerySet) -> Optional[QuerySet]: ...
def queryset(self, request: HttpRequest, queryset: _QuerySetAlias) -> Optional[_QuerySetAlias]: ...
def expected_parameters(self) -> Optional[List[str]]: ...

class SimpleListFilter(ListFilter):
Expand Down Expand Up @@ -102,7 +102,7 @@ class AllValuesFieldListFilter(FieldListFilter):
lookup_val: Any = ...
lookup_val_isnull: Any = ...
empty_value_display: str = ...
lookup_choices: QuerySet = ...
lookup_choices: _QuerySetAlias = ...
def choices(self, changelist: Any) -> Iterator[Dict[str, Any]]: ...

class RelatedOnlyFieldListFilter(RelatedFieldListFilter):
Expand Down
24 changes: 12 additions & 12 deletions django-stubs/contrib/admin/options.pyi
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ from django.db.models.base import Model
from django.db.models.fields import Field
from django.db.models.fields.related import ForeignKey, ManyToManyField, RelatedField
from django.db.models.options import Options
from django.db.models.query import QuerySet
from django.db.models.query import _QuerySetAlias
from django.forms.fields import Field as FormField
from django.forms.fields import TypedChoiceField
from django.forms.forms import BaseForm
Expand Down Expand Up @@ -112,7 +112,7 @@ class BaseModelAdmin(Generic[_ModelT]):
def formfield_for_choice_field(self, db_field: Field, request: HttpRequest, **kwargs: Any) -> TypedChoiceField: ...
def get_field_queryset(
self, db: Optional[str], db_field: RelatedField, request: HttpRequest
) -> Optional[QuerySet]: ...
) -> Optional[_QuerySetAlias]: ...
def formfield_for_foreignkey(
self, db_field: ForeignKey, request: HttpRequest, **kwargs: Any
) -> ModelChoiceField: ...
Expand All @@ -131,7 +131,7 @@ class BaseModelAdmin(Generic[_ModelT]):
def get_prepopulated_fields(
self, request: HttpRequest, obj: Optional[_ModelT] = ...
) -> Dict[str, Sequence[str]]: ...
def get_queryset(self, request: HttpRequest) -> QuerySet[_ModelT]: ...
def get_queryset(self, request: HttpRequest) -> _QuerySetAlias[_ModelT]: ...
def get_sortable_by(self, request: HttpRequest) -> Sequence[str]: ...
def lookup_allowed(self, lookup: str, value: str) -> bool: ...
def to_field_allowed(self, request: HttpRequest, to_field: str) -> bool: ...
Expand Down Expand Up @@ -167,7 +167,7 @@ class ModelAdmin(BaseModelAdmin[_ModelT]):
delete_selected_confirmation_template: Optional[_TemplateForResponseT] = ...
object_history_template: Optional[_TemplateForResponseT] = ...
popup_response_template: Optional[_TemplateForResponseT] = ...
actions: Optional[Sequence[Union[Callable[[ModelAdmin, HttpRequest, QuerySet], None], str]]] = ...
actions: Optional[Sequence[Union[Callable[[ModelAdmin, HttpRequest, _QuerySetAlias], None], str]]] = ...
action_form: Any = ...
actions_on_top: bool = ...
actions_on_bottom: bool = ...
Expand Down Expand Up @@ -197,7 +197,7 @@ class ModelAdmin(BaseModelAdmin[_ModelT]):
def get_paginator(
self,
request: HttpRequest,
queryset: QuerySet,
queryset: _QuerySetAlias,
per_page: int,
orphans: int = ...,
allow_empty_first_page: bool = ...,
Expand All @@ -217,11 +217,11 @@ class ModelAdmin(BaseModelAdmin[_ModelT]):
def get_list_select_related(self, request: HttpRequest) -> Union[bool, Sequence[str]]: ...
def get_search_fields(self, request: HttpRequest) -> Sequence[str]: ...
def get_search_results(
self, request: HttpRequest, queryset: QuerySet, search_term: str
) -> Tuple[QuerySet[_ModelT], bool]: ...
self, request: HttpRequest, queryset: _QuerySetAlias, search_term: str
) -> Tuple[_QuerySetAlias[_ModelT], bool]: ...
def get_preserved_filters(self, request: HttpRequest) -> str: ...
def _get_edited_object_pks(self, request: HttpRequest, prefix: str) -> List[str]: ...
def _get_list_editable_queryset(self, request: HttpRequest, prefix: str) -> QuerySet[_ModelT]: ...
def _get_list_editable_queryset(self, request: HttpRequest, prefix: str) -> _QuerySetAlias[_ModelT]: ...
def construct_change_message(
self, request: HttpRequest, form: AdminPasswordChangeForm, formsets: Iterable[BaseFormSet], add: bool = ...
) -> List[Dict[str, Dict[str, List[str]]]]: ...
Expand All @@ -236,7 +236,7 @@ class ModelAdmin(BaseModelAdmin[_ModelT]):
def save_form(self, request: Any, form: Any, change: Any): ...
def save_model(self, request: Any, obj: _ModelT, form: Any, change: Any) -> None: ...
def delete_model(self, request: HttpRequest, obj: _ModelT) -> None: ...
def delete_queryset(self, request: HttpRequest, queryset: QuerySet) -> None: ...
def delete_queryset(self, request: HttpRequest, queryset: _QuerySetAlias) -> None: ...
def save_formset(self, request: Any, form: Any, formset: Any, change: Any) -> None: ...
def save_related(self, request: Any, form: Any, formsets: Any, change: Any) -> None: ...
def render_change_form(
Expand All @@ -255,7 +255,7 @@ class ModelAdmin(BaseModelAdmin[_ModelT]):
def response_post_save_add(self, request: HttpRequest, obj: _ModelT) -> HttpResponseRedirect: ...
def response_post_save_change(self, request: HttpRequest, obj: _ModelT) -> HttpResponseRedirect: ...
# Probably FileResponse cannot come from ModelAdmin views
def response_action(self, request: HttpRequest, queryset: QuerySet) -> Optional[HttpResponse]: ...
def response_action(self, request: HttpRequest, queryset: _QuerySetAlias) -> Optional[HttpResponse]: ...
def response_delete(self, request: HttpRequest, obj_display: str, obj_id: int) -> HttpResponse: ...
def render_delete_form(self, request: Any, context: Any): ...
def get_inline_formsets(
Expand All @@ -277,7 +277,7 @@ class ModelAdmin(BaseModelAdmin[_ModelT]):
) -> HttpResponse: ...
def changelist_view(self, request: HttpRequest, extra_context: Optional[Dict[str, Any]] = ...) -> HttpResponse: ...
def get_deleted_objects(
self, objs: Union[Sequence[_ModelT], QuerySet[_ModelT]], request: HttpRequest
self, objs: Union[Sequence[_ModelT], _QuerySetAlias[_ModelT]], request: HttpRequest
) -> Tuple[List[Model], Dict[str, int], Set[str], List[str]]: ...
def delete_view(
self, request: HttpRequest, object_id: str, extra_context: Optional[Dict[str, Any]] = ...
Expand Down Expand Up @@ -315,7 +315,7 @@ class InlineModelAdmin(Generic[_ChildModelT, _ParentModelT], BaseModelAdmin[_Chi
def get_formset(
self, request: HttpRequest, obj: Optional[_ParentModelT] = ..., **kwargs: Any
) -> Type[BaseInlineFormSet[_ChildModelT, _ParentModelT, forms.ModelForm[_ChildModelT]]]: ...
def get_queryset(self, request: HttpRequest) -> QuerySet[_ChildModelT]: ...
def get_queryset(self, request: HttpRequest) -> _QuerySetAlias[_ChildModelT]: ...
def has_add_permission(self, request: HttpRequest, obj: Optional[_ParentModelT]) -> bool: ... # type: ignore
def has_change_permission(self, request: HttpRequest, obj: Optional[_ParentModelT] = ...) -> bool: ... # type: ignore
def has_delete_permission(self, request: HttpRequest, obj: Optional[_ParentModelT] = ...) -> bool: ... # type: ignore
Expand Down
4 changes: 2 additions & 2 deletions django-stubs/contrib/admin/sites.pyi
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ from django.contrib.admin.options import ModelAdmin
from django.contrib.auth.forms import AuthenticationForm
from django.core.checks import CheckMessage
from django.db.models.base import Model
from django.db.models.query import QuerySet
from django.db.models.query import _QuerySetAlias
from django.http.request import HttpRequest
from django.http.response import HttpResponse
from django.template.response import TemplateResponse
Expand All @@ -22,7 +22,7 @@ else:

all_sites: MutableSet[AdminSite]

_ActionCallback = Callable[[ModelAdmin, HttpRequest, QuerySet], Optional[TemplateResponse]]
_ActionCallback = Callable[[ModelAdmin, HttpRequest, _QuerySetAlias], Optional[TemplateResponse]]

class AlreadyRegistered(Exception): ...
class NotRegistered(Exception): ...
Expand Down
10 changes: 5 additions & 5 deletions django-stubs/contrib/admin/utils.pyi
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ from django.db.models.base import Model
from django.db.models.deletion import Collector
from django.db.models.fields import Field, reverse_related
from django.db.models.options import Options
from django.db.models.query import QuerySet
from django.db.models.query import _QuerySetAlias
from django.forms.forms import BaseForm
from django.forms.formsets import BaseFormSet
from django.http.request import HttpRequest
Expand All @@ -25,7 +25,7 @@ def unquote(s: str) -> str: ...
def flatten(fields: Any) -> List[Union[Callable, str]]: ...
def flatten_fieldsets(fieldsets: Any) -> List[Union[Callable, str]]: ...
def get_deleted_objects(
objs: Union[Sequence[Optional[Model]], QuerySet[Model]], request: HttpRequest, admin_site: AdminSite
objs: Union[Sequence[Optional[Model]], _QuerySetAlias[Model]], request: HttpRequest, admin_site: AdminSite
) -> Tuple[List[Model], Dict[str, int], Set[str], List[str]]: ...

class NestedObjects(Collector):
Expand All @@ -41,12 +41,12 @@ class NestedObjects(Collector):
def add_edge(self, source: Optional[Model], target: Model) -> None: ...
def related_objects(
self, related_model: Type[Model], related_fields: Iterable[Field], objs: _IndexableCollection[Model]
) -> QuerySet[Model]: ...
) -> _QuerySetAlias[Model]: ...
def nested(self, format_callback: Callable = ...) -> List[Any]: ...
def can_fast_delete(self, *args: Any, **kwargs: Any) -> bool: ...

def model_format_dict(obj: Union[Model, Type[Model], QuerySet, Options[Model]]): ...
def model_ngettext(obj: Union[Options, QuerySet], n: Optional[int] = ...) -> str: ...
def model_format_dict(obj: Union[Model, Type[Model], _QuerySetAlias, Options[Model]]): ...
def model_ngettext(obj: Union[Options, _QuerySetAlias], n: Optional[int] = ...) -> str: ...
def lookup_field(
name: Union[Callable, str], obj: Model, model_admin: Optional[BaseModelAdmin] = ...
) -> Tuple[Optional[Field], Optional[str], Any]: ...
Expand Down
10 changes: 5 additions & 5 deletions django-stubs/contrib/admin/views/main.pyi
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ from django.contrib.admin.options import ModelAdmin, _DisplayT, _ListFilterT
from django.db.models.base import Model
from django.db.models.expressions import Expression
from django.db.models.options import Options
from django.db.models.query import QuerySet
from django.db.models.query import _QuerySetAlias
from django.forms.formsets import BaseFormSet
from django.http.request import HttpRequest
from typing_extensions import Literal
Expand All @@ -24,7 +24,7 @@ class ChangeList:
model: Type[Model] = ...
opts: Options = ...
lookup_opts: Options = ...
root_queryset: QuerySet = ...
root_queryset: _QuerySetAlias = ...
list_display: _DisplayT = ...
list_display_links: _DisplayT = ...
list_filter: Sequence[_ListFilterT] = ...
Expand Down Expand Up @@ -80,13 +80,13 @@ class ChangeList:
paginator: Any = ...
def get_results(self, request: HttpRequest) -> None: ...
def get_ordering_field(self, field_name: Union[Callable, str]) -> Optional[Union[Expression, str]]: ...
def get_ordering(self, request: HttpRequest, queryset: QuerySet) -> List[Union[Expression, str]]: ...
def get_ordering(self, request: HttpRequest, queryset: _QuerySetAlias) -> List[Union[Expression, str]]: ...
def get_ordering_field_columns(self) -> Dict[int, Literal["desc", "asc"]]: ...
def get_queryset(self, request: HttpRequest) -> QuerySet: ...
def get_queryset(self, request: HttpRequest) -> _QuerySetAlias: ...
filter_specs: List[ListFilter]
has_filters: bool
has_active_filters: bool
clear_all_filters_qs: str
def apply_select_related(self, qs: QuerySet) -> QuerySet: ...
def apply_select_related(self, qs: _QuerySetAlias) -> _QuerySetAlias: ...
def has_related_field_in_list_display(self) -> bool: ...
def url_for_result(self, result: Model) -> str: ...
6 changes: 3 additions & 3 deletions django-stubs/contrib/contenttypes/fields.pyi
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ from django.db.models.fields.mixins import FieldCacheMixin
from django.db.models.fields.related import ForeignObject
from django.db.models.fields.related_descriptors import ReverseManyToOneDescriptor
from django.db.models.fields.reverse_related import ForeignObjectRel
from django.db.models.query import QuerySet
from django.db.models.query import _QuerySetAlias
from django.db.models.query_utils import FilteredRelation, PathInfo
from django.db.models.sql.where import WhereNode

Expand Down Expand Up @@ -46,7 +46,7 @@ class GenericForeignKey(FieldCacheMixin):
self, obj: Optional[Model] = ..., id: Optional[int] = ..., using: Optional[str] = ...
) -> ContentType: ...
def get_prefetch_queryset(
self, instances: Union[List[Model], QuerySet], queryset: Optional[QuerySet] = ...
self, instances: Union[List[Model], _QuerySetAlias], queryset: Optional[_QuerySetAlias] = ...
) -> Tuple[List[Model], Callable, Callable, bool, str, bool]: ...
def __get__(self, instance: Optional[Model], cls: Optional[Type[Model]] = ...) -> Optional[Any]: ...
def __set__(self, instance: Model, value: Optional[Any]) -> None: ...
Expand Down Expand Up @@ -86,7 +86,7 @@ class GenericRelation(ForeignObject):
def get_extra_restriction(
self, where_class: Type[WhereNode], alias: Optional[str], remote_alias: str
) -> WhereNode: ...
def bulk_related_objects(self, objs: List[Model], using: str = ...) -> QuerySet: ...
def bulk_related_objects(self, objs: List[Model], using: str = ...) -> _QuerySetAlias: ...

class ReverseGenericManyToOneDescriptor(ReverseManyToOneDescriptor): ...

Expand Down
4 changes: 2 additions & 2 deletions django-stubs/contrib/contenttypes/models.pyi
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ from typing import Any, Dict, Optional, Tuple, Type, Union

from django.db import models
from django.db.models.base import Model
from django.db.models.query import QuerySet
from django.db.models.query import _QuerySetAlias

class ContentTypeManager(models.Manager["ContentType"]):
def get_by_natural_key(self, app_label: str, model: str) -> ContentType: ...
Expand All @@ -20,5 +20,5 @@ class ContentType(models.Model):
def name(self) -> str: ...
def model_class(self) -> Optional[Type[Model]]: ...
def get_object_for_this_type(self, **kwargs: Any) -> Model: ...
def get_all_objects_for_this_type(self, **kwargs: Any) -> QuerySet: ...
def get_all_objects_for_this_type(self, **kwargs: Any) -> _QuerySetAlias: ...
def natural_key(self) -> Tuple[str, str]: ...
10 changes: 5 additions & 5 deletions django-stubs/contrib/sitemaps/__init__.pyi
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ from django.contrib.sites.models import Site
from django.contrib.sites.requests import RequestSite
from django.core.paginator import Paginator
from django.db.models.base import Model
from django.db.models.query import QuerySet
from django.db.models.query import _QuerySetAlias

PING_URL: str

Expand All @@ -20,7 +20,7 @@ class Sitemap:
languages: Optional[Sequence[str]] = ...
alternates: bool = ...
x_default: bool = ...
def items(self) -> Union[Sequence[Any], QuerySet[Any]]: ...
def items(self) -> Union[Sequence[Any], _QuerySetAlias[Any]]: ...
def location(self, item: Model) -> str: ...
@property
def paginator(self) -> Paginator: ...
Expand All @@ -31,15 +31,15 @@ class Sitemap:
class GenericSitemap(Sitemap):
priority: Optional[float] = ...
changefreq: Optional[str] = ...
queryset: QuerySet[Model] = ...
queryset: _QuerySetAlias[Model] = ...
date_field: Optional[str] = ...
protocol: Optional[str] = ...
def __init__(
self,
info_dict: Mapping[str, Union[datetime, QuerySet[Model], str]],
info_dict: Mapping[str, Union[datetime, _QuerySetAlias[Model], str]],
priority: Optional[float] = ...,
changefreq: Optional[str] = ...,
protocol: Optional[str] = ...,
) -> None: ...
def lastmod(self, item: Model) -> Optional[datetime]: ...
def items(self) -> QuerySet[Model]: ...
def items(self) -> _QuerySetAlias[Model]: ...
1 change: 0 additions & 1 deletion django-stubs/core/paginator.pyi
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
from typing import Generic, Iterable, Iterator, Optional, Protocol, Sequence, Sized, TypeVar, Union, overload

from django.db.models.base import Model
from django.db.models.query import QuerySet

class UnorderedObjectListWarning(RuntimeWarning): ...
class InvalidPage(Exception): ...
Expand Down
4 changes: 2 additions & 2 deletions django-stubs/db/migrations/recorder.pyi
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ from typing import Any, Dict, Tuple

from django.db.backends.base.base import BaseDatabaseWrapper
from django.db.models.base import Model
from django.db.models.query import QuerySet
from django.db.models.query import _QuerySetAlias

class MigrationRecorder:
class Migration(Model):
Expand All @@ -12,7 +12,7 @@ class MigrationRecorder:
connection: BaseDatabaseWrapper = ...
def __init__(self, connection: BaseDatabaseWrapper) -> None: ...
@property
def migration_qs(self) -> QuerySet: ...
def migration_qs(self) -> _QuerySetAlias: ...
def has_table(self) -> bool: ...
def ensure_schema(self) -> None: ...
def applied_migrations(self) -> Dict[Tuple[str, str], Migration]: ...
Expand Down
Loading

0 comments on commit 31784dc

Please sign in to comment.