【问题标题】:Django cyclic imports and typechecking with mypyDjango 循环导入和使用 mypy 进行类型检查
【发布时间】:2020-10-02 02:41:01
【问题描述】:

我正在尝试使用我的一个 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()

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

# 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)

但是,我遇到了 2 个错误。

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

我对键入 python 还很陌生,以前从未遇到过这个问题。我知道 2 正在发生,因为 PublishedBundle 尚未定义,但我无法定义它,因为它会导致循环导入。谁能帮帮我?

【问题讨论】:

  • 使用PublishedBundle作为变量名和类型在任何情况下都会有问题。

标签: python django mypy python-typing


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2020-03-17
    • 2016-09-02
    • 2022-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-25
    • 1970-01-01
    相关资源
    最近更新 更多