【问题标题】:How to Lazy Load a model in a managers to stop circular imports?如何在管理器中延迟加载模型以停止循环导入?
【发布时间】:2015-06-26 22:48:09
【问题描述】:

在 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 中有没有办法延迟加载模型?

【问题讨论】:

    标签: python django django-models


    【解决方案1】:

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

    【讨论】:

    • 如何导入包含模型选择的枚举对象?
    • @МихаилПавлов 将选择放在模型类中。
    • 如果some_function 返回YourModel 的实例,我该如何进行类型检查?即def some_function(self) -> YourModel:
    【解决方案2】:

    你有几个选择:

    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 没有惰性导入吗?我总是被告知页面底部的导入很糟糕!
    • @OrbiterFleet: 是的,我已将其添加为替代选项 :)
    • get_model 完美!谢谢
    猜你喜欢
    • 1970-01-01
    • 2015-10-06
    • 2016-07-01
    • 2012-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-28
    相关资源
    最近更新 更多