Django循环导入和使用mypy进行类型检查



我正试图用我的一个Django模型创建一个简单的自定义管理器。它会导致循环导入,因为我试图从models.py导入管理器,从managers.py导入模型。但是,因为我的管理器正在创建模型并添加一些额外的属性,所以方法的类型提示是模型实例。我在修复该类型提示时遇到了问题,因为它尚未导入。

# models.py
from .managers import PublishedBundleManager
class PublishedBundle(models.Model):
data = JSONField()
md5_checksum = models.CharField(max_length=128)
objects = PublishedBundleManager()

经理有一种方法可以帮助我创建模型实例,但为了方便起见,可以计算一个校验和,以便在创建过程中填写。为了修复循环导入,我使用了键入。类型检查

# managers.py
import typing as t
from django.apps import apps
from django.db import models
if t.TYPE_CHECKING:
PublishedBundle = apps.get_model(app_label="the_hugh", model_name="PublishedBundle")
class PublishedBundleManager(models.Manager):  # Error 1
def create_publish(self, data: t.Dict, description: str) -> PublishedBundle:  # Error 2
PublishedBundle = apps.get_model(app_label="my_app", model_name="PublishedBundle")
json_data = json.dumps(data, sort_keys=True)
md5_checksum = hashlib.md5(json_data.encode("utf-8")).hexdigest()
return PublishedBundle.objects.create(data=data, md5_checksum=md5_checksum)

然而,我有两个错误。

  1. Missing type parameters for generic type "Manager" [type-arg]mypy(error)
  2. 名称"PublishedBundle"未定义

我对类型化python还很陌生,以前从未遇到过这个问题。我知道发生2是因为PublishedBundle还没有定义,但我不能定义它,因为它会导致循环导入。有人能帮我吗?

解决这一问题的一个简单方法是将管理器和模型放在同一个文件中。无论如何,它们有着错综复杂的关系。

最新更新