我正在开发一个 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
字段,当然可以为 None。
我不明白我在第二个错误中做错了什么。
我的主要问题是我不确定解决这些错误的规范方法是什么。 ManyToMany 字段总是可以返回一个可选值,但不使用它们显然是错误的答案。我可以在我的代码中附加一些
# type: ignore
语句,但随后我只是规避问题而不是解决问题。
有谁知道我做错了什么,如果是的话,在这种情况下使用 mypy 的正确方法是什么?
最有可能的是,出现此错误是因为
home_team
中没有任何项目。像这样尝试一下:
seasons