Python/Django-Mypy:expression的类型为;键入[ModelInstance],“;,变量的类型为“;“模型实例”;

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

我正在开发一个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: 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]
)。