Jas*_*per 8 python django mypy
我正在开发一个 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]")
Run Code Online (Sandbox Code Playgroud)
这些错误是由下面的代码引发的。我正在启动(但不创建/保存到数据库)模型的实例Match。
match = Match(
home_team=home_team,
away_team=away_team,
league=home_team.seasons.last().league,
season=home_team.seasons.all().last(),
)
Run Code Online (Sandbox Code Playgroud)
涉及的型号如下所示:
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
)
Run Code Online (Sandbox Code Playgroud)
我理解第一个错误 ( Item "None" of "Optional[Season]" has no attribute "league")
asSeasons指的是一个ManyToMany字段,当然可以是None。我不明白我在第二个错误中做错了什么。
我的主要问题是我不确定解决这些错误的规范方法是什么。ManyToMany 字段总是可以返回一个可选值,但不使用它们显然是错误的答案。我可以在我的代码中添加一些# type: ignore语句,但是我只是在回避问题而不是解决问题。
有谁知道我做错了什么,如果是的话,在这些情况下使用 mypy 的正确方法是什么?
| 归档时间: |
|
| 查看次数: |
1251 次 |
| 最近记录: |