Django печатать: как решить ошибку с возможно пустым QuerySet - PullRequest
0 голосов
/ 08 января 2020

Этот метод класса UserProfile выделяется моей проверенной типом (pyright):

@classmethod
    def service_users_out_of_sync(
        cls, threshold_in_hours=OUT_OF_SYNC_THRESHOLD_HOURS
    ) -> QuerySetType["UserProfile"]:
        our_timezone = pytz.timezone(conf_settings.TIME_ZONE)
        now = datetime.datetime.now(tz=our_timezone)
        x_hours_ago = datetime.timedelta(hours=threshold_in_hours)
        offset = now - x_hours_ago
        return cls.objects.filter(
            Q(service_last_sync_at__isnull=True) | Q(service_last_sync_at__lte=offset),
            wants_service_sync=True,
        )

Ошибка, которую он показывает, такова:

Выражение тип 'QuerySet [Any, Any]' нельзя присвоить типу возврата 'QuerySetType [UserProfile]' *

«QuerySet [Any, Any]» несовместим с «QuerySetType [UserProfile]» *

Полагаю, это связано с тем, что моим оператором return может быть пустой QuerySet (?). Тем не менее, я озадачен тем, как решить эту проблему.

Вот как выглядит QuerySetType:

class QuerySetType(Generic[DjangoModel], extra=Iterable):
    """
    This type represents django.db.models.QuerySet interface.
    Defined Types:
        DjangoModel - model instance
        QuerysetType[DjangoModel] - Queryset of DjangoModel instances
        Iterator[DjangoModel] - Iterator of DjangoModel instances
    """

    def __iter__(self) -> Iterator[DjangoModel]:
        ...

    def all(self) -> "QuerySetType[DjangoModel]":
        ...

    def order_by(self, *args: Any) -> "QuerySetType[DjangoModel]":
        ...

    def count(self) -> int:
        ...

    def filter(self, **kwargs: Any) -> "QuerySetType[DjangoModel, DjangoModel]":
        ...

    def exclude(self, **kwargs: Any) -> "QuerySetType[DjangoModel]":
        ...

    def get(self, **kwargs: Any) -> DjangoModel:
        ...

    def annotate(self, **kwargs: Any) -> "QuerySetType[DjangoModel]":
        ...

    def first(self) -> Optional[DjangoModel]:
        ...

    def update(self, **kwargs: Any) -> DjangoModel:
        ...

    def delete(self, **kwargs: Any) -> Tuple[int, Dict[str, int]]:
        ...

    def last(self) -> Optional[DjangoModel]:
        ...

    def exists(self) -> bool:
        ...

    def values(self, *args: Any) -> "QuerySetType[DjangoModel]":
        ...

    def values_list(self, *args: Any) -> "QuerySetType[DjangoModel]":
        ...

    def __or__(self, other) -> Optional[DjangoModel]:
        ...

    def __getitem__(self, index) -> Union[DjangoModel, "QuerySetType[DjangoModel]"]:
        ...

    def __len__(self) -> int:
        ...
...