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

Python 如何在管理器中延迟加载模型以停止循环导入?,python,django,django-models,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:无法导入名称Seco

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

要停止循环导入,请执行
self.model
。但是,如果我需要在我的经理中引用不同的模型,即

from models import SecondModel
second= SecondModel(name=test).save()
self.model(second=second)
我收到以下错误:
ImportError:无法导入名称SecondModel


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

您有几个选项:

1.按名称导入 Django有一个用于按字符串名称导入的实用函数,因此您无需自行导入。有几种方法可用于此(请参见此问题:)

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开始,当前接受的答案已被弃用;从中,您可以像这样修改代码

from django.apps import apps

class SomeModelManager(...):
    ...

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

Django没有惰性导入吗?我总是被告知页面底部的导入是不好的@OrbiterFleet:是的,我添加了这个选项作为替代选项:)
get\u model
perfect!ThanksHow我是否导入包含来自模型的选项的枚举对象?@МааааПаааааааааааааааа?i、 e.
def一些函数(self)->您的模型:
from django.apps import apps

class SomeModelManager(...):
    ...

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