关于python:如何在管理器中lazy load加载模型以停止循环导入?

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

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

为了阻止循环进口,我做了self.model。但是,如果我需要在我的经理中引用不同的模型,即

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

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

那么,Django有没有一种方法可以延迟加载模型?


从django 1.7开始,不推荐使用当前接受的答案;从这个答案开始,您可以这样修改代码。

1
2
3
4
5
6
7
from django.apps import apps

class SomeModelManager(...):
    ...

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


您有几个选择:

1。按名称导入

Django有一个按字符串名称导入的实用程序函数,因此您不需要自己导入。有几种方法可用于此目的(请参阅此问题:django:get model from string?)

1
2
3
4
5
6
7
8
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

1
2
3
4
5
import managers

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

managers.py

1
2
3
4
5
6
7
class SomeModelManager(...):
    ...

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

import models