我的Django项目中有一个Team模型。我用QuerySet.as_manager()创建了它的自定义模型管理器。
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给出以下错误:
error: "Manager[Any]" has no attribute "active"In [5]: Team.objects
Out[5]: <django.db.models.manager.ManagerFromTeamQuerySet at 0x10eee1f70>如果我显式地定义了一个TeamManager类,就不会有问题。如何向动态生成的类提示Django model字段objects的类型?
发布于 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似乎很好地解决了您的问题,不幸的是,它相当陈旧。
发布于 2020-12-23 06:28:32
为了MyPy的缘故,我用一个小的switch-a-roo解决了这个问题:
_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()https://stackoverflow.com/questions/63242801
复制相似问题