我正在阅读有关此主题的许多文档,博客和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
在没有冲突的情况下导入这些子模块的方法是什么?
答案 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)
导入模块时,模块中的代码会被执行,因此如果您可以将此行移动到函数或方法中,那么这将延迟执行该行,直到两个模块完全导入为止。
这是一个更好的解释: