![](/img/trans.png)
[英]Index from related object backward foreignKey relation in Django (related_name)
[英]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.