最近使用Python + Django,是一个巨复杂的系统,才几天就40多张数据库的表了。由于在Django里面,表都使用类来实现的,因此就要一开始写不少的class,语法都没问题,可是有时候就会出现ImportError Can not import name xxxx
python
这个问题碰见了两次,稍微有点差异,如今记录一下来。数据库
1.类之间的循环依赖
代码大体是这样的django
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,这样确定就是错误的了。app
2.不一样模块之间的
Service.model 模块.net
from Appointment.models import Appointment class Order(models.Model): appointment = models.ForeignKey(Appointment)
在Appointment.models里面code
from Service.models import ServiceItem
这样也会引用错误,这个缘由找了好长时间。
由于Order在引用Appointment的时候,会回到Service.models 查找Appointment引用的ServiceItem,可是这个时候Order的构建尚未完成,就会导入错误。这个和Python的机制有关系的。ci
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-makeget