Python中循环导入和依赖错误

最近使用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

    原文作者:virusdefender
    原文地址: https://segmentfault.com/a/1190000000620849
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞