Я работаю над проектом 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 в этих обстоятельствах?