为了账号安全,请及时绑定邮箱和手机立即绑定

Django & mypy: ValuesQuerySet type hint

Django & mypy: ValuesQuerySet type hint

达令说 2022-08-02 10:47:09
对于返回如下所示的查询集的函数,使用什么类型的提示?def _get_cars_for_validation(filter_: dict) -> QuerySet:     return (         Car.objects.filter(**filter_)         .values("id", "brand", "engine")         .order_by("id")     )mypy返回错误不兼容的返回值类型(获取“ValuesQuerySet[Car, TypedDict({'id': int, 'brand': str, 'engine': str})]”, expected “QuerySet[Any]”)我会使用,但它在Django 1.9中被删除了。 报告来自 3rd party lib django-stubs(我无法导入它;它真的可能吗?)。ValuesQuerySetValuesQuerySetmypy
查看完整描述

2 回答

?
幕布斯6054654

TA贡献1876条经验 获得超7个赞

我遇到了完全相同的问题,我在GitHub问题中找到了解决方案:


import typing


if typing.TYPE_CHECKING:

    from django.db.models.query import ValuesQuerySet


def _get_cars_for_validation(filter_: dict) -> 'ValuesQuerySet[Car, int]':

    return (

        Car.objects.filter(**filter_)

        .values("id", "brand", "engine")

        .order_by("id")

    )

当您运行程序时,将阻止,因为不存在的仅在 mypy 检查期间导入。另请注意,注释必须是字符串:。if typing.TYPE_CHECKINGImportErrorValuesQuerySet'ValuesQuerySet[Car, int]'


第二个论点对我来说是一个谜;问题的OP使用了“并且它有效”,在我的情况下,我尝试了其他几种类型,并且它们也都有效;我想你也可以用,我想。'ValuesQuerySet[Car, int]'intAny


您可以使用 reveal_type() 自行检查变量的类型。


查看完整回答
反对 回复 2022-08-02
?
开满天机

TA贡献1786条经验 获得超12个赞

您也可以投射到:QuerySet


from typing import cast


from django.db.models import QuerySet


return (

        cast(QuerySet, Car.objects.filter(**filter_))

        .values("id", "brand", "engine")

        .order_by("id")

    )


查看完整回答
反对 回复 2022-08-02
  • 2 回答
  • 0 关注
  • 102 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信