我已经将django-模型-utils添加到现有的(大型)项目中,而构建现在正在失败,因为构建的一部分包括使用mypy进行静态类型检查。
它抱怨我添加了objects = InheritanceManager()的模型没有反向ForeignKeys的属性,如果反向FK是在该模型上的方法中访问的。例如,以以下内容为例:
class Student(Model):
school = ForeignKey(School, related_name='students')
class School(Model):
objects = InheritanceManager() # IRL School is a subclass of some other model
def something(self):
return self.students.filter(...)然后运行mypy对它,将返回:
error: "School" has no attribute "students"即使我移除related_name,并使用self.student_set (即默认的django关系),它仍然会产生相同类型的错误。只有删除InheritanceManager才能修复静态类型检查。当然,我使用它是有原因的,因为我需要在代码的其他地方使用select_subclasses。
有没有人遇到过这种情况,或者有什么解决办法?
发布于 2022-07-29 11:17:14
django-stubs使用插件添加所有管理器。只有当添加的管理器是models.Manager的“子类”(不仅是真正的子类,而且还可以被models.Manager识别)时,才会触发这个插件。
django-model-utils是非类型化的,因此InheritanceManager实际上是用于mypy的Any,而插件没有看到它。为了准确地解决这个问题,我在包安装后将py.typed标记添加到django-model-utils作为CI阶段。您还可以在py.typed中使用叉,也可以为django-model-utils创建存根包。这可能导致其他问题,并没有提供良好的类型检查(所有未注释的方法都有Any作为隐式参数和返回类型),但总比没有好。为了满足我的需要,记号笔已经足够了。
py.typed标记是位于package (venv/lib/.../django_model_utils/py.typed)中的一个空文件-它告诉mypy包不需要单独的存根,并且包含所有必需的类型。
https://stackoverflow.com/questions/73165489
复制相似问题