python 如何在django设置中使用模型?

kcugc4gi  于 2023-05-27  发布在  Python
关注(0)|答案(2)|浏览(147)

我需要使用我的一个模型来定义Django设置变量。这意味着,django变量将由数据库中的内容定义。
当我使用一个使用我的模型之一的函数时:

from util.auth_utils import get_app_auth 
auth = get_app_auth()

它抛出一个错误:

django.core.exceptions.AppRegistryNotReady: Apps aren't loaded yet.

如果我尝试在www.example.com中使用此代码settings.py:

import django
django.setup()

也抛出一个错误:

RuntimeError: Model class django.contrib.contenttypes.models.ContentType doesn't declare an explicit app_label and isn't in an application in INSTALLED_APPS.

除此之外,我尝试将django.setup()部分移动到INSTALLED_APPS之后,但它无法正确加载设置。
有线索吗?

pgvzfuti

pgvzfuti1#

我们不能在www.example.com末尾的DATABASE设置之后导入一个模型吗settings.py比如DATABASE = {

'default': {
    'ENGINE': 'django.db.backends.postgresql_psycopg2',
    'NAME': xx ,
    'USER': xx,
    'PASSWORD': xx ,
    'HOST': xx ,
    'PORT': xx,
}

} ...其他设置... from .models import

nlejzf6q

nlejzf6q2#

可能有更好的方法,但你可以做的是懒惰的评估,这样当设置被导入时定义的是能够访问数据库对象的代码,并且只有当应用程序实际引用该设置时才能检索该对象。假设这是在Django完成了数据库和模型的设置之后,一切都会很好。
这是我刚编的一个例子

class LazyInstance( object):
    def __init__(self, app_label, modelname, lookupfield, lookupvalue):
      self.appname = app_label
      self.modelname = modelname.lower()
      self.lookupfield = lookupfield
      self.lookupvalue = lookupvalue

    @property
    def value(self):
        if hasattr( self, '_value'):
            return self._value

        print( "LazyInstance getting object")
        from django.apps import apps

        Model = apps.get_model(
            app_label=self.appname,
            model_name=self.modelname)

        self._value = Model.objects.get( 
            **{ self.lookupfield: self.lookupvalue })
        return self._value

settings.py:

from playpen.lazy_instance import  LazyInstance
PLAY_FOO = LazyInstance( 'stock','memdesc', 'pk', 8552)

我的开发服务器没有崩溃。使用./manage.py shell_plus

>>> from django.conf import settings
>>> settings.PLAY_FOO.value
LazyInstance getting object
<MemDesc id=8552: stuff... >
>>> settings.PLAY_FOO.value   # note, no second DB access
<MemDesc id=8552: stuff... >

我将把从对象中提取所需的字段并将它们复制到PLAY_FOO的其他属性中作为练习。

相关问题