Как указать тип «объектов» поля модели Django динамически сгенерированному классу? - PullRequest
4 голосов
/ 04 августа 2020

У меня в проекте 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 поля модели objects динамически сгенерированному классу?

1 Ответ

2 голосов
/ 13 августа 2020

Основываясь на Manager[Any], я предполагаю, что вы уже используете django-stubs.

К сожалению, похоже, что есть открытая проблема с созданием QuerySet.as_manager generi c по модели, прикрепленной к , которая еще не решена.

Даже если PR, посвященный проблеме , будет объединен, я боюсь, что это не решит вашу непосредственную проблему потому что as_manager должен быть общим c над общим c QuerySet подклассом, используемым для создания менеджера, чтобы были доступны как .active, так и атрибуты, относящиеся к Team.

В этом отношении этот другой PR , который, к сожалению, довольно устарел, кажется, правильно решает вашу проблему.

...