繁体   English   中英

Django:向后键入提示/related_name/ForeignKey 关系

[英]Django: typehinting backward / related_name / ForeignKey relationships

假设我们有以下模型:

class Site(models.Model):
    # This is djangos build-in Site Model
    pass

class Organization(models.Model):
    site = models.OneToOneField(Site)

如果我在其他 class 的某个地方使用它:

organization = self.site.organization

然后mypy抱怨:

Site has no attribute "organization"

我怎样才能让 mypy 在这里开心?

我只懂一点英语,我不知道这是不是真的。 但是你可以添加

站点 = models.OneToOneField(站点,on_delete=models.CASCADE)

您需要设置related_name属性:

class Organization(models.Model):
    site = models.OneToOneField(Site, related_name="organization")

Django 在运行时添加了反向关系,mypy 无法捕获这些关系, mypy仅进行 static 分析。

为了让mypy满意(并使其与编辑器的自动完成功能一起使用),您需要向Site添加显式类型提示:

class Site(models.Model):
    organization: "Organization"

class Organization(models.Model):
    site = models.OneToOneField(Site)

需要在类型周围使用引号,因为我们在定义Organization之前对其进行了前向引用

对于外键和多对多关系,您可以做同样的事情,但使用QuerySet类型提示代替:

class Organization(models.Model):
    site = models.OneToOneField(Site)
    employees: models.QuerySet["Employee"]

class Employee(models.Model):
    organization = models.ForeignKey(
        Organization,
        on_delete=models.CASCADE,
        related_name="employees",
    )

编辑:有一个django-stubs package 旨在与mypy集成,但是我没有亲自使用它。 它可以为此提供解决方案,而无需向模型显式添加类型提示。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM