Python Django 1.7型号是';获取外键字段时尚未加载

Python Django 1.7型号是';获取外键字段时尚未加载,python,django,django-1.7,Python,Django,Django 1.7,我有一个类,该类将由项目\uuuu init\uuuuu.py调用(因为我想在django网站启动时将值保存在内存中): 但是当它试图打印r.area.area\u name时,它会出错: raise AppRegistryNotReady("Models aren't loaded yet.") django.core.exceptions.AppRegistryNotReady: Models aren't loaded yet. 为什么它不能打印r.area.area\u name

我有一个类,该类将由项目
\uuuu init\uuuuu.py
调用(因为我想在
django
网站启动时将值保存在内存中):

但是当它试图打印
r.area.area\u name
时,它会出错:

  raise AppRegistryNotReady("Models aren't loaded yet.")
django.core.exceptions.AppRegistryNotReady: Models aren't loaded yet.
为什么它不能打印
r.area.area\u name

这是模型

class Area(models.Model):
    area_name = models.CharField(max_length=255, null=False, blank=False)

class Gateway(models.Model):  
    mac_address = models.CharField(max_length=50, null=False, blank=False)
    area = models.ForeignKey(Area,null=True,blank=True,related_name = 'area')

错误清楚地表明了这一点——模型还没有准备好。您可以触摸数据库的较早时刻已经到来,但它仍然有一些限制


如果您想安全地使用所有模型,请将代码放入项目根目录中的
url.py

通过在
\uuuuuu init\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuupy
文件中调用模型,您正在创建一个鸡和蛋的场景。初始化代码要求模型准备就绪,并且模型正在等待
\uuuu init\uuuuuuuuupy
准备就绪

\uuuu init\uuuuuu.py
文件中调用这种类型的代码不是一种好的做法。因为这个文件不仅在django启动时加载,而且在导入模块时加载

从您的代码中,我可以看到您正试图访问用户ip和基于此的其他信息

最好的方法是使用自定义的
中间件
截取
请求/响应
,并根据值更新
请求/响应
对象

类似的东西-

class CustomMiddleware(object):
    def process_request(self, request):
        rec = get_rec()
        request.rec = rec;
现在,您可以访问
request
的属性
rec
,并使用任何您喜欢的方式

您可以在此处阅读更多有关中间产品的信息-


您应该在django加载后调用依赖于django的初始化代码。只有当django.setup()运行时,应用程序注册表才准备就绪

假设您有默认的wsgi.py文件,则正确的入口点位于wsgi.py中:

import os
from django.core.wsgi import get_wsgi_application
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings")    
application = get_wsgi_application() # this prepares django 
my_init_code()

如果您确实需要在加载模型之前运行一些东西,请使用直接SQL到DB。

如果在启动时只需要一次操作,最好不要将其放在每次运行的中间件中request@AviahLaor同意,但我没有回答在内存中放些东西来启动,我回答了OP的场景,跟踪mac,最好在每个请求中都这样做。用户可以轻松地更改mac,这与django启动无关。
import os
from django.core.wsgi import get_wsgi_application
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings")    
application = get_wsgi_application() # this prepares django 
my_init_code()