Python Django无法导入名称(模型)
我有两个文件在这个应用程序,这是混乱。一个更新缓存,另一个是my models.py文件。由于某些原因,每当我尝试加载服务器时,我都会得到Python Django无法导入名称(模型),python,django,caching,Python,Django,Caching,我有两个文件在这个应用程序,这是混乱。一个更新缓存,另一个是my models.py文件。由于某些原因,每当我尝试加载服务器时,我都会得到ImportError:无法导入名称“Cache”。将缓存定义移动到导航项定义上方对一次测试引导有效,但此后每次都失败 navbar/models.py from django.db import models from navbar.generator import update_navigation from datetime import datetim
ImportError:无法导入名称“Cache”
。将缓存
定义移动到导航项
定义上方对一次测试引导有效,但此后每次都失败
navbar/models.py
from django.db import models
from navbar.generator import update_navigation
from datetime import datetime
import logging
class NavigationItem(models.Model):
# The title used in the navar
title = models.CharField(max_length=25, blank=False)
# The dir it points to
dir = models.ForeignKey('library.Dir', blank=True, null=True)
# The level above it
previous_level = models.ForeignKey('NavigationItem', on_delete=models.SET_NULL, null=True, blank=True)
# Is it on the top level
top_level = models.BooleanField(default=False)
# Shortcut
show_all_subdirs = models.BooleanField(default=False)
# position on the list
position = models.SmallIntegerField(default=15)
# last modified:
last_modified = models.DateTimeField(auto_now=True)
def __str__(self):
return self.title
def __repr__(self):
return "({}) {}".format(self.pk, self.title)
def save(self, *args, **kwargs):
super(NavigationItem, self).save(*args, **kwargs)
logging.INFO("Saved Navbar at " + datetime.now())
update_navigation()
class Cache(models.Model):
key = models.CharField(max_length=10, default="key", unique=True)
data = models.TextField()
timestamp = models.DateTimeField(auto_now=True)
from navbar.models import Cache, NavigationItem
from datetime import datetime
import logging
def render_navigation():
query = Cache.objects.filter(key="nav")
if query.count() > 0:
return query[0].data
else:
return update_navigation()
def update_navigation():
# Strings used in the generation of templates
dropdown = '''<li>
<a class="dropdown-toggle" data-toggle="dropdown" href="{}">{} <span class="caret"></span></a>
<ul class="dropdown-menu">
{}
</ul>
</li>
'''
link = '<li><a href="{}">{}</a></li>'
# inner functions
def generate_navigation(navigation_items):
# The string to be returned
result = ""
# for every item in the list that we get
for item in navigation_items:
# if the item points somewhere get the path otherwise make a hash
path = item.dir.path if item.dir else "#"
# if it has sub-navigation items
if item.navigationitem_set.count() > 0:
# the query below will get all the navigation items under this one sorted properly
query = item.navigationitem_set.all().order_by('position')
result += dropdown.format(path, item.title, generate_navigation(query))
elif item.show_all_subdirs and item.dir is not None:
result += render_subdirs(item.dir)
else:
result += link.format(path, item.title)
return result
def render_subdirs(directory):
result = ""
for folder in directory.dir_set.all().order_by('title'):
if folder.dir_set.count() > 0:
result += dropdown.format(folder.path, folder.title, render_subdirs(folder))
else:
result += link.format(folder.path, folder.title)
return result
# The meat of the function
# Log the timestamps for debugging and logistics
logging.INFO("Navbar Render Begun at " + datetime.now())
query = NavigationItem.objects.filter(top_level=True).order_by('position')
result = generate_navigation(query)
logging.INFO("Navbar Rendered at " + datetime.now())
if Cache.objects.filter(key="nav").count() > 0:
cache = Cache.objects.get(key="nav")
cache.data = result # WTF HOW DID I FORGET THIS???
else:
cache = Cache(key="nav", data=result)
cache.save()
logging.INFO("Navbar Saved at: " + datetime.now())
return result
navbar/generator.py
from django.db import models
from navbar.generator import update_navigation
from datetime import datetime
import logging
class NavigationItem(models.Model):
# The title used in the navar
title = models.CharField(max_length=25, blank=False)
# The dir it points to
dir = models.ForeignKey('library.Dir', blank=True, null=True)
# The level above it
previous_level = models.ForeignKey('NavigationItem', on_delete=models.SET_NULL, null=True, blank=True)
# Is it on the top level
top_level = models.BooleanField(default=False)
# Shortcut
show_all_subdirs = models.BooleanField(default=False)
# position on the list
position = models.SmallIntegerField(default=15)
# last modified:
last_modified = models.DateTimeField(auto_now=True)
def __str__(self):
return self.title
def __repr__(self):
return "({}) {}".format(self.pk, self.title)
def save(self, *args, **kwargs):
super(NavigationItem, self).save(*args, **kwargs)
logging.INFO("Saved Navbar at " + datetime.now())
update_navigation()
class Cache(models.Model):
key = models.CharField(max_length=10, default="key", unique=True)
data = models.TextField()
timestamp = models.DateTimeField(auto_now=True)
from navbar.models import Cache, NavigationItem
from datetime import datetime
import logging
def render_navigation():
query = Cache.objects.filter(key="nav")
if query.count() > 0:
return query[0].data
else:
return update_navigation()
def update_navigation():
# Strings used in the generation of templates
dropdown = '''<li>
<a class="dropdown-toggle" data-toggle="dropdown" href="{}">{} <span class="caret"></span></a>
<ul class="dropdown-menu">
{}
</ul>
</li>
'''
link = '<li><a href="{}">{}</a></li>'
# inner functions
def generate_navigation(navigation_items):
# The string to be returned
result = ""
# for every item in the list that we get
for item in navigation_items:
# if the item points somewhere get the path otherwise make a hash
path = item.dir.path if item.dir else "#"
# if it has sub-navigation items
if item.navigationitem_set.count() > 0:
# the query below will get all the navigation items under this one sorted properly
query = item.navigationitem_set.all().order_by('position')
result += dropdown.format(path, item.title, generate_navigation(query))
elif item.show_all_subdirs and item.dir is not None:
result += render_subdirs(item.dir)
else:
result += link.format(path, item.title)
return result
def render_subdirs(directory):
result = ""
for folder in directory.dir_set.all().order_by('title'):
if folder.dir_set.count() > 0:
result += dropdown.format(folder.path, folder.title, render_subdirs(folder))
else:
result += link.format(folder.path, folder.title)
return result
# The meat of the function
# Log the timestamps for debugging and logistics
logging.INFO("Navbar Render Begun at " + datetime.now())
query = NavigationItem.objects.filter(top_level=True).order_by('position')
result = generate_navigation(query)
logging.INFO("Navbar Rendered at " + datetime.now())
if Cache.objects.filter(key="nav").count() > 0:
cache = Cache.objects.get(key="nav")
cache.data = result # WTF HOW DID I FORGET THIS???
else:
cache = Cache(key="nav", data=result)
cache.save()
logging.INFO("Navbar Saved at: " + datetime.now())
return result
来自navbar.models导入缓存,NavigationItem
从日期时间导入日期时间
导入日志记录
def render_导航():
query=Cache.objects.filter(key=“nav”)
如果query.count()大于0:
返回查询[0]。数据
其他:
返回更新_导航()
def更新_导航():
#用于生成模板的字符串
下拉菜单='''
{}
'''
link=''
#内部功能
def生成导航(导航项目):
#要返回的字符串
result=“”
#对于我们得到的列表中的每一项
对于导航项目中的项目:
#如果项目指向某个地方,则获取路径,否则创建散列
路径=item.dir.path如果item.dir else“#”
#如果它有子导航项
如果item.navigationitem_set.count()>0:
#下面的查询将正确排序此项下的所有导航项
query=item.navigationitem\u set.all().order\u by('position')
结果+=下拉列表.format(路径、项.title、生成\导航(查询))
elif item.show_all_子目录和item.dir不是None:
结果+=渲染子曲面(item.dir)
其他:
结果+=link.format(路径、项、标题)
返回结果
def render_子目录:
result=“”
对于目录.dir\u set.all()中的文件夹,按('title')排序:
如果folder.dir\u set.count()大于0:
结果+=下拉菜单.format(folder.path、folder.title、render_子菜单(文件夹))
其他:
结果+=link.format(folder.path、folder.title)
返回结果
#功能的核心
#记录调试和后勤的时间戳
logging.INFO(“Navbar渲染开始于”+datetime.now())
query=NavigationItem.objects.filter(顶层=True)。排序依据('position')
结果=生成导航(查询)
logging.INFO(“在“+datetime.now()处呈现的导航栏”)
如果Cache.objects.filter(key=“nav”).count()大于0:
cache=cache.objects.get(key=“nav”)
cache.data=result#WTF我怎么忘了这个???
其他:
缓存=缓存(key=“nav”,数据=结果)
cache.save()
logging.INFO(“导航栏保存在:”+datetime.now())
返回结果
完全错误:
Traceback (most recent call last):
File "manage.py", line 22, in <module>
execute_from_command_line(sys.argv)
File "C:\Program Files\Python 3.5\lib\site-packages\django\core\management\__init__.py", line 367, in execute_from_command_line
utility.execute()
File "C:\Program Files\Python 3.5\lib\site-packages\django\core\management\__init__.py", line 341, in execute
django.setup()
File "C:\Program Files\Python 3.5\lib\site-packages\django\__init__.py", line 27, in setup
apps.populate(settings.INSTALLED_APPS)
File "C:\Program Files\Python 3.5\lib\site-packages\django\apps\registry.py", line 108, in populate
app_config.import_models(all_models)
File "C:\Program Files\Python 3.5\lib\site-packages\django\apps\config.py", line 199, in import_models
self.models_module = import_module(models_module_name)
File "C:\Program Files\Python 3.5\lib\importlib\__init__.py", line 126, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "<frozen importlib._bootstrap>", line 986, in _gcd_import
File "<frozen importlib._bootstrap>", line 969, in _find_and_load
File "<frozen importlib._bootstrap>", line 958, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 673, in _load_unlocked
File "<frozen importlib._bootstrap_external>", line 662, in exec_module
File "<frozen importlib._bootstrap>", line 222, in _call_with_frames_removed
File "C:\Users\User\project\navbar\models.py", line 2, in <module>
from navbar.generator import update_navigation
File "C:\Users\User\project\navbar\generator.py", line 1, in <module>
from navbar.models import Cache, NavigationItem
ImportError: cannot import name 'Cache'
回溯(最近一次呼叫最后一次):
文件“manage.py”,第22行,在
从命令行(sys.argv)执行命令
文件“C:\Program Files\Python 3.5\lib\site packages\django\core\management\ \uuuu init\uuuu.py”,第367行,从命令行执行
utility.execute()
文件“C:\Program Files\Python 3.5\lib\site packages\django\core\management\\uuuu init\uuuu.py”,第341行,在execute中
django.setup()
文件“C:\Program Files\Python 3.5\lib\site packages\django\\uuuuu init\uuuuuu.py”,第27行,在安装程序中
应用程序。填充(设置。已安装的应用程序)
文件“C:\Program Files\Python 3.5\lib\site packages\django\apps\registry.py”,第108行,填充
app_config.import_models(所有_models)
文件“C:\Program Files\Python 3.5\lib\site packages\django\apps\config.py”,第199行,在import\u模型中
self.models\u module=导入模块(models\u module\u name)
文件“C:\Program Files\Python 3.5\lib\importlib\\uuuuu init\uuuuu.py”,第126行,在导入模块中
return _bootstrap._gcd_import(名称[级别:],包,级别)
文件“”,第986行,在_gcd_import中
文件“”,第969行,在“查找”和“加载”中
文件“”,第958行,在“查找”和“加载”中解锁
文件“”,第673行,在“加载”中
exec_模块中第662行的文件“”
文件“”,第222行,在已删除帧的调用中
文件“C:\Users\User\project\navbar\models.py”,第2行,在
从navbar.generator导入更新\u导航
文件“C:\Users\User\project\navbar\generator.py”,第1行,在
从navbar.models导入缓存,NavigationItem
ImportError:无法导入名称“缓存”
这是正常的,因为您正在进行循环导入(models.py从generator.py导入,反之亦然)
尝试在模型中使用方法导入,然后应将其修复:
class NavigationItem(models.Model):
...
def save(self, *args, **kwargs):
# Method level import to avoid circular imports
from .navigation import update_navigation
super(NavigationItem, self).save(*args, **kwargs)
logging.INFO("Saved Navbar at " + datetime.now())
update_navigation()
当
缓存
无法加载时,是否确实可以导入导航项
?如果将每个代码都包装在一个try…块中,会发生什么情况呢?
块除外?谢谢。我现在将我的导入修复到下一个bug。。。一旦系统允许,我会接受答案