如何延迟加载管理器中的模型以停止循环导入?

How to Lazy Load a model in a managers to stop circular imports?

在 Django 中,您可以为模型创建管理器。为此,我添加了一个名为 managers.py 的新文件,并在我的模型中添加了 objects = MyManager().

为了停止循环导入,我这样做了 self.model。但是,如果我需要在我的经理中引用不同的模型,即

from models import SecondModel
second= SecondModel(name=test).save()
self.model(second=second)

我收到以下错误:ImportError: cannot import name SecondModel

那么 Django 有没有办法延迟加载模型?

您有几个选择:

1。按名称导入

Django 有一个通过字符串名称导入的实用函数,所以你不需要自己导入。有几种方法可用于此(请参阅此问题:Django: Get model from string?

from django.db.models.loading import get_model

class SomeModelManager(...):
    ...

    def some_function(self):
        model = get_model('your_app', 'YourModel')
        object = model()

2。底部导入

managers.py 文件底部添加导入,并确保只导入模块而不是模型本身。

所以...

models.py:

import managers

class SomeModel(models.Model):
    ...
    objects = managers.SomeModelManager()

managers.py

class SomeModelManager(...):
    ...

    def some_function(self):
        object = models.SomeOtherModel()

import models

从 Django 1.7 开始,不推荐使用当前接受的答案;从 this answer,你可以像这样调整你的代码。

from django.apps import apps

class SomeModelManager(...):
    ...

    def some_function(self):
        model = apps.get_model(app_label='your_app', model_name='YourModel')