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

Pro*_*eus 7 python django django-models

在Django中,您可以为模型创建管理器.我这样做是通过managers.py在我的模型中添加一个名为和的新文件objects = MyManager().

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

from models import SecondModel
second= SecondModel(name=test).save()
self.model(second=second)
Run Code Online (Sandbox Code Playgroud)

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

那么在Django中是否有一种懒惰加载模型的方法?

Sat*_*nix 20

从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')
Run Code Online (Sandbox Code Playgroud)

  • 如何导入包含模型选择的枚举对象? (2认同)
  • 如果“some_function”返回“YourModel”的实例,我该如何通过类型检查来做到这一点?即 `def some_function(self) -> YourModel:` (2认同)

Wol*_*lph 8

你有几个选择:

1.按名称导​​入

Django有一个实用程序函数,用于按字符串名称导入,因此您无需自行导入.有几种方法可用于此(请参阅此问题:Django:从字符串中获取模型?)

from django.db.models.loading import get_model

class SomeModelManager(...):
    ...

    def some_function(self):
        model = get_model('your_app', 'YourModel')
        object = model()
Run Code Online (Sandbox Code Playgroud)

2.底部进口

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

所以...

models.py:

import managers

class SomeModel(models.Model):
    ...
    objects = managers.SomeModelManager()
Run Code Online (Sandbox Code Playgroud)

managers.py

class SomeModelManager(...):
    ...

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

import models
Run Code Online (Sandbox Code Playgroud)