Python/Django-Mypy:expression的类型为;键入[ModelInstance],“;,变量的类型为“;“模型实例”;
我正在开发一个Django应用程序,它为前端提供了一个GraphQLAPI。我正在使用mypy进行类型检查,在运行mypy时,我遇到了我不理解的错误 运行时,我会出现以下错误:Python/Django-Mypy:expression的类型为;键入[ModelInstance],“;,变量的类型为“;“模型实例”;,python,django,mypy,Python,Django,Mypy,我正在开发一个Django应用程序,它为前端提供了一个GraphQLAPI。我正在使用mypy进行类型检查,在运行mypy时,我遇到了我不理解的错误 运行时,我会出现以下错误: api/schema.py:50: error: Incompatible types in assignment (expression has type "Type[Academy]", variable has type "Academy") api/schema.py:57: error: Incompatibl
api/schema.py:50: error: Incompatible types in assignment (expression has type "Type[Academy]", variable has type "Academy")
api/schema.py:57: error: Incompatible types in assignment (expression has type "Type[School]", variable has type "School")
api/schema.py:64: error: Incompatible types in assignment (expression has type "Type[AcademyGroup]", variable has type "AcademyGroup")
这是mypy正在检查的代码
class AcademyType(DjangoObjectType):
class Meta:
model: Academy = Academy
filter_fields: List[str] = ['name', 'domain', 'slug']
interfaces: Tuple = (relay.Node,)
class SchoolType(DjangoObjectType):
class Meta:
model: School = School
filter_fields: List[str] = ['name', 'academy']
interfaces: Tuple = (relay.Node,)
class AcademyGroupType(DjangoObjectType):
class Meta:
model: AcademyGroup = AcademyGroup
filter_fields: List[str] = ['name', 'academy']
interfaces: Tuple = (relay.Node,)
因此,不断失败的代码行是model:AcademyGroup=AcademyGroup
上的变体,但这只是在我的代码中出现的“Django model as type”定义(似乎没有生成错误)
因此,我不确定我在这里做错了什么,因此非常感谢您的帮助。您的
模型
属性的类型不是类本身,而是类型
。实际上,如果你说model=Academy
,那么model
的类型是type(model)==type(Academy)==type
,实际上,Academy
不是Academy
对象,它是对类的引用,此类类的类型是type
的一个(子类)。您还可以使用来指定类型的(基)类,因此type[C]
意味着它是C
类型,或C
的子类:
因此,您应该将其注释为:
from typing import Type
class AcademyType(DjangoObjectType):
class Meta:
model: Type[Academy] = Academy
filter_fields: List[str] = ['name', 'domain', 'slug']
interfaces: Tuple = (relay.Node,)
class SchoolType(DjangoObjectType):
class Meta:
model: Type[School] = School
filter_fields: List[str] = ['name', 'academy']
interfaces: Tuple = (relay.Node,)
class AcademyGroupType(DjangoObjectType):
class Meta:
model: Type[AcademyGroup] = AcademyGroup
filter_fields: List[str] = ['name', 'academy']
interfaces: Tuple = (relay.Node,)
从键入导入类型
类AcademyType(DjangObjectType):
类元:
型号:类型[学院]=学院
筛选字段:列表[str]=['name','domain','slug']
接口:Tuple=(relay.Node,)
班级学校类型(DjangObjectType):
类元:
型号:类型[学校]=学校
筛选字段:列表[str]=['name','academy']
接口:Tuple=(relay.Node,)
类AcademyGroupType(DjangObjectType):
类元:
型号:类型[AcademyGroup]=AcademyGroup
筛选字段:列表[str]=['name','academy']
接口:Tuple=(relay.Node,)
模型的类型不是School
,而是type
(或type[School]
)。