避免在Django模型(配置类)中进行循环导入

时间:2018-07-17 14:25:04

标签: django python-3.x django-models python-import

我已经在django中创建了一个配置模型,以便站点管理员可以随时更改某些设置,但是某些模型依赖于这些配置。我正在使用Django 2.0.2和Python 3.6.4。

我在与models.py相同的目录中创建了一个config.py文件。

让我使用paracode(将代码设为paraphase?Real Enum还有更多选择):

# models.py
from .config import *

class Configuration(models.Model):
    starting_money = models.IntegerField(default=1000)

class Person(models.Model):
    funds = models.IntegarField(default=getConfig(ConfigData.STARTING_MONEY))

# config.py
from .models import Configuration

class ConfigData(Enum):
    STARTING_MONEY = 1
def getConfig(data):
    if not isinstance(data, ConfigData):
        raise TypeError(f"{data} is not a valid configuration type")
    try:
        config = Configuration.objects.get_or_create()
    except Configuration.MultipleObjectsReturned:
        # Cleans database in case multiple configurations exist.
        Configuration.objects.exclude(Configuration.objects.first()).delete()
        return getConfig(data)
    if data is ConfigData.MAXIMUM_STAKE:
        return config.max_stake

如何做到这一点而不会出现导入错误?我尝试了绝对进口

2 个答案:

答案 0 :(得分:3)

您可以通过将{em>加载到@RequestMapping(value = "/postNews", method = RequestMethod.POST) public Greeting greeting(@RequestBody ParentJsonInfo parentJsonInfo) { Jsonobject jsonObject= parentJsonInfo.getjsonObject(); } 函数中的中来推迟加载models.py,因此我们不再需要{{1} },当我们加载getConfig(data)时:

models.py

因此,我们config.py加载到# config.py (no import in the head) class ConfigData(Enum): STARTING_MONEY = 1 def getConfig(data): from .models import Configuration if not isinstance(data, ConfigData): raise TypeError(f"{data} is not a valid configuration type") try: config = Configuration.objects.get_or_create() except Configuration.MultipleObjectsReturned: # Cleans database in case multiple configurations exist. Configuration.objects.exclude(Configuration.objects.first()).delete() return getConfig(data) if data is ConfigData.MAXIMUM_STAKE: return config.max_stake中。我们仅在实际执行 models.py函数时检查它是否已加载(如果不加载,则加载它),此过程随后进行。

答案 1 :(得分:1)

威廉·范昂塞姆(Willem Van Onsem)的解决方案是一个很好的解决方案。我使用另一种方法,使用django's Applications registry来处理循环模型依赖项。我将其作为替代解决方案发布在这里,部分原因是我希望获得更多有经验的python编码器的反馈,以了解这种方法是否存在问题。

在实用程序模块中,定义以下方法:

from django.apps import apps as django_apps

def model_by_name(app_name, model_name):
  return django_apps.get_app_config(app_name).get_model(model_name)

然后在您的getConfig中,省略导入并替换行

config = Configuration.objects.get_or_create()

具有以下内容:

config_class = model_by_name(APP_NAME, 'Configuration')
config = config_class.objects.get_or_create()