我已经在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
如何做到这一点而不会出现导入错误?我尝试了绝对进口
答案 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()