Django / Mypy: несовместимый тип для моделей - PullRequest
0 голосов
/ 04 ноября 2019

Я работаю над проектом Django и использую mypy для проверки типов. Чтобы включить проверку типов для django, я использую пакет django-stubs .

Это прекрасно работает, но теперь я столкнулся с ситуацией, когда mypy выдает две ошибки, которые, похоже, не могу решить:

Item "None" of "Optional[Season]" has no attribute "league"

Incompatible type for "league" of "Match" (got "Union[ForeignKey[Union[League, Combinable], League], Any]", expected "Union[League, Combinable, None]")

Эти ошибки возникают для приведенного ниже кода. Я инициирую (но не создаю / не сохраняю в базу данных) экземпляр модели Match.

match = Match(
            home_team=home_team,
            away_team=away_team,
            league=home_team.seasons.last().league,
            season=home_team.seasons.all().last(),
        )

Соответствующие модели отображаются ниже:

class League(models.Model):
    name = models.CharField(max_length=200)


class Season(models.Model):
    first_year = models.PositiveIntegerField()
    second_year = models.PositiveIntegerField()
    league = models.ForeignKey(
        League, related_name="seasons", on_delete=models.CASCADE
    )


class Team(models.Model):
    name = models.CharField(max_length=200)
    seasons = models.ManyToManyField(Season, related_name="teams")


class Match(models.Model):
    league = models.ForeignKey(
        League, related_name="matches", on_delete=models.CASCADE
    )
    season = models.ForeignKey(
        Season, related_name="matches", on_delete=models.CASCADE
    )
    home_team = models.ForeignKey(
        Team, related_name="home_matches", on_delete=models.CASCADE
    )
    away_team = models.ForeignKey(
        Team, related_name="away_matches", on_delete=models.CASCADE
    )

Я понимаю первую ошибку (Item "None" of "Optional[Season]" has no attribute "league")

Как Seasons относится к ManyToMany поле, которое, конечно, может быть Нет. Я не вижу, что я делаю неправильно для второй ошибки.

Моя главная проблема заключается в том, что я не уверен, что канонический способ решить эти ошибки. Поле ManyToMany всегда может возвращать необязательное значение, но их использование, очевидно, является неправильным ответом. Я мог бы добавить несколько # type: ignore операторов в мой код, но тогда я просто обхожу проблему, а не решаю ее.

Кто-нибудь знает, что я делаю неправильно, и - если да - каков правильный способ использования mypy в этих обстоятельствах?

...