如何延迟加载管理器中的模型以停止循环导入?
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')
在 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')