Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django无法导入名称(模型)_Python_Django_Caching - Fatal编程技术网

Python Django无法导入名称(模型)

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

我有两个文件在这个应用程序,这是混乱。一个更新缓存,另一个是my models.py文件。由于某些原因,每当我尝试加载服务器时,我都会得到
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。。。一旦系统允许,我会接受答案