Tengo un modelo de Team en mi proyecto Django. Creo su administrador de modelos personalizado con 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() Cuando intento ejecutar Team.objects.active() , mypy da el siguiente error:
error: "Manager[Any]" has no attribute "active" In [5]: Team.objects Out[5]: <django.db.models.manager.ManagerFromTeamQuerySet at 0x10eee1f70> Si estuviera definiendo explícitamente una clase TeamManager , no habría ningún problema. ¿Cómo puedo sugerir el tipo de objects de campo del modelo Django a una clase generada dinámicamente?
Basado en Manager[Any] , asumo que ya está usando django-stubs .
Desafortunadamente , parece que hay un problema abierto para hacer que QuerySet.as_manager sea genérico sobre el modelo al que está adjunto que aún no se ha resuelto.
Incluso si el PR que aborda el problema se fusionó, me temo que no resolvería su problema inmediato porque as_manager debe ser genérico sobre la subclase genérica QuerySet utilizada para crear el administrador para que tanto .active esté disponible como los atributos relacionados. al Team estar disponible.
En este sentido, este otro PR , que lamentablemente está bastante obsoleto, parece abordar adecuadamente su problema.
He solucionado esto con un pequeño cambio por el bien de MyPy:
_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()