首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何向动态生成的类提示Django的model字段`objects`的类型?

如何向动态生成的类提示Django的model字段`objects`的类型?
EN

Stack Overflow用户
提问于 2020-08-04 16:19:15
回答 2查看 1.1K关注 0票数 8

我的Django项目中有一个Team模型。我用QuerySet.as_manager()创建了它的自定义模型管理器。

代码语言:javascript
复制
class TeamQuerySet(models.QuerySet):
    def active(self) -> "models.QuerySet[Team]":
        return self.filter(is_active=True)

class Team(models.Model):
    is_active = models.BooleanField()

    objects = TeamQuerySet.as_manager()

当我尝试执行Team.objects.active()时,mypy给出以下错误:

代码语言:javascript
复制
error: "Manager[Any]" has no attribute "active"
代码语言:javascript
复制
In [5]: Team.objects
Out[5]: <django.db.models.manager.ManagerFromTeamQuerySet at 0x10eee1f70>

如果我显式地定义了一个TeamManager类,就不会有问题。如何向动态生成的类提示Django model字段objects的类型?

EN

回答 2

Stack Overflow用户

发布于 2020-08-13 12:55:43

根据Manager[Any],我假设您已经在使用django-stubs了。

不幸的是,it looks like there's an open issue to make QuerySet.as_manager generic over the model it's attached to还没有得到解决。

即使合并了the PR addressing the issue,恐怕也不能解决您当前的问题,因为as_manager需要是用于创建管理器的泛型QuerySet子类之上的泛型,以便.active和与Team相关的属性都可用。

在这方面,这个other PR似乎很好地解决了您的问题,不幸的是,它相当陈旧。

票数 4
EN

Stack Overflow用户

发布于 2020-12-23 06:28:32

为了MyPy的缘故,我用一个小的switch-a-roo解决了这个问题:

代码语言:javascript
复制
_Q = TypeVar("_Q", bound="WorkflowQuerySet")


class WorkflowQuerySet(models.QuerySet["WorkflowModel"]):
    """
    Queryset for workflow objects.
    """

    def count_objects(self) -> int:
        raise NotImplementedError

    def latest_objects(self: _Q) -> _Q:
        raise NotImplementedError


if TYPE_CHECKING:
    # Create a type MyPy understands
    class WorkflowManager(models.Manager["WorkflowModel"]):
        def count_objects(self) -> int:
            ...

        def latest_objects(self) -> _Q:
            ...


else:
    WorkflowManager = WorkflowQuerySet.as_manager


class WorkflowModel(models.Model):
    """
    A model that has workflow.
    """

    objects = WorkflowManager()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63242801

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档