如何懒惰在经理中加载模型以停止循环导入?

时间:2015-04-20 09:29:26

标签: python django django-models

在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中有一种延迟加载模型的方法吗?

2 个答案:

答案 0 :(得分:18)

从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')

答案 1 :(得分:6)

您有几个选择:

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