Django - 循环导入模块和子模块

时间:2014-12-08 18:32:28

标签: python django

我正在阅读有关此主题的许多文档,博客和SE问题,但我无法正确理解。我在一个名为maps

的模块中的models.py和tms.py之间进行了循环导入

models.py

from maps.tms import tileMapConfig

class LayerMapOptions(models.Model):
    layer = models.ForeignKey(Shapefile)
    basqui_map = models.ForeignKey(BasquiMap)
    position = models.IntegerField(max_length=100, blank=True, null=True)
    visible = models.BooleanField(default=False)
    styles = models.ManyToManyField(LayerStyle, null=True, blank=True)

    def save(self, *args, **kwargs):
        super(LayerMapOptions, self).save(*args, **kwargs)
        self.basqui_map.date_updated = datetime.now()
        self.basqui_map.save()
        tileMapConfig(self.basqui_map.pk)

tms.py:

from maps.models import LayerMapOptions

result = LayerMapOptions.objects.filter(basqui_map__pk=map_id)

def tileMapConfig(map_id):
    ...

导致以下错误:

from maps.models import LayerMapOptions ImportError: cannot import name LayerMapOptions

在没有冲突的情况下导入这些子模块的方法是什么?

2 个答案:

答案 0 :(得分:2)

只需将导入到使用它的函数中:

def tileMapConfig(map_id):
    from maps.models import LayerMapOptions
    ...

或者

def save(self, *args, **kwargs):        
    from maps.tms import tileMapConfig
    ...

模块只导入一次,因此每次重新进入函数时,它都不会重新导入整个模块,只会从已经导入的模块中获取它,因此几乎没有性能问题。

答案 1 :(得分:2)

一种方法是使用完整的命名空间。

import maps.tms
maps.tmstileMapConfig(self.basqui_map.pk)

另一个问题是您在导入期间运行了一些全局代码:

result = LayerMapOptions.objects.filter(basqui_map__pk=map_id)

导入模块时,模块中的代码会被执行,因此如果您可以将此行移动到函数或方法中,那么这将延迟执行该行,直到两个模块完全导入为止。

这是一个更好的解释:

http://effbot.org/zone/import-confusion.htm