资讯专栏INFORMATION COLUMN

Python中循环导入和依赖错误

刘福 / 2145人阅读

摘要:类之间的循环依赖代码大致是这样的这样,依赖,依赖,又会回到,这样肯定就是错误的了。因为在引用的时候,会回到查找引用的,但是这个时候的构建还没有完成,就会导入错误。也就是使用字符串表示模块,而不进行导入了。

最近使用Python + Django,是一个巨复杂的系统,才几天就40多张数据库的表了。因为在Django里面,表都使用类来实现的,所以就要一开始写很多的class,语法都没问题,但是有时候就会出现ImportError Can not import name xxxx

这个问题遇见了两次,稍微有点差别,现在记录一下来。

1.类之间的循环依赖
代码大致是这样的

class Employee(models.Model):
    permission = models.ManyToManyField(Permission)
class Permission(models.Model):
    dealer = models.ForeiginKey(Dealer)
    name = models.CharField(max_length=20)
class Dealer(models.Model):
    employees = models.ManyToManyField(Employee)

这样,Employee依赖Permission,Permission依赖Dealer,Dealer又会回到Employee,这样肯定就是错误的了。

2.不同模块之间的
Service.model 模块

from Appointment.models import Appointment

class Order(models.Model):
    appointment = models.ForeignKey(Appointment)

在Appointment.models里面

from Service.models import ServiceItem

这样也会引用错误,这个原因找了好长时间。
因为Order在引用Appointment的时候,会回到Service.models 查找Appointment引用的ServiceItem,但是这个时候Order的构建还没有完成,就会导入错误。这个和Python的机制有关系的。

3.解决办法
今天又遇见这问题了,虽然找到了原因,但是不知道怎么去修改,因为毕竟业务逻辑在这,现在有stackoverflow上找到一个答案,真心好用。
也就是使用字符串表示模块,而不进行导入了。
http://stackoverflow.com/questions/4379042/django-circular-model-import-help

class Service(models.Model):
    appointment = models.ForeignKey("appointment.Appointment")

参考
http://www.douban.com/group/topic/43938606/
http://www.oschina.net/question/919901_88601
http://www.oschina.net/translate/top-10-mistakes-that-python-programmers-make

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/37320.html

相关文章

  • python解决mysql视图导入导出依赖问题

    摘要:是可视化工具中最棒的,但是,在处理视图的导入导出方面,它是按照视图名称的字母顺序来处理的,若视图存在依赖,在导入过程中就会报错。 navicat是mysql可视化工具中最棒的,但是,在处理视图的导入导出方面,它是按照视图名称的字母顺序来处理的,若视图存在依赖,在导入过程中就会报错。这个问题一直困绕我,一度因为我使用docker来部署mysql而绕过了这个问题。最近不得不直面这个问题,因...

    Brenner 评论0 收藏0
  • FlaskWeb开发读书笔记之jinja2模板

    摘要:注模板包含不存在此问题。在模板中,使用过滤器显式地标记一个字符串为安全的临时地完全禁用自动转义系统。通过在声明中直接添加或,当前的上下文可以传递到模板,而且不会自动禁用缓存。 官网:http://jinja.pocoo.org/docs/dev/中文文档:http://docs.jinkan.org/docs/j...当前版本2.8 安装:pip install Jinja2Flask...

    tangr206 评论0 收藏0
  • 独家 | 6种让Python程序变慢的坏习惯

    摘要:假设我们需要在程序中计算一些数字的平方根。此外如果我们需要在程序中多次使用平方根函数,代码将会更整洁。然而在这个虚构的例子中,只有的年龄超过岁。然后检查这三个人的年龄是否满足第二个条件。 作者: Christopher Tao翻译:王可汗校对:王雨桐本文约1800字,建议阅读5分钟本文...

    xcc3641 评论0 收藏0
  • python 循环导入

    摘要:记录前段时间学习时遇到的循环导入问题何为循环导入栗子很简单现在有三个包中导入中导入中导入然后随便以一个文件为入口执行程序假如以作为程序入口大概就像下面这样现在执行就会报出导入错误类似下面这个详细介绍在核心编程中有介绍有时间可以看一下重点是 记录前段时间学习 Flask 时遇到的循环导入问题 何为循环导入? 栗子很简单, 现在有a.py, b.py, c.py 三个包, b.py 中导入...

    EsgynChina 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<