Django / Mypy:模型类型不兼容

问题描述 投票:0回答:1

我正在开发一个 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 的正确方法是什么?

python django mypy
1个回答
0
投票

最有可能的是,出现此错误是因为

home_team
中没有任何项目。
像这样尝试一下:

seasons

	
© www.soinside.com 2019 - 2024. All rights reserved.