Spa*_*cus 11 python django import circular-dependency
我在不同的情况下遇到过几次这个问题,但我的设置如下:
我有两个Django模型文件.一个包含用户可以用来注册课程的用户模型和CouponCodes.这些都在account/models.py文件中.课程和相关的多对多字段位于不同的模型文件course/models.py中.我通常在我的代码中将这些分别称为amod和cmod.
在课程/ models.py中我有一个import语句:
from account import models as amod
class Course(ExtendedModel):
stuff = stuff
Run Code Online (Sandbox Code Playgroud)
我需要为Course和User之间的多对多模型/表导入account/models.py文件,这里没有显示.到现在为止还挺好.
在account/models.py文件中,我有CouponCode模型.每个实例都会创建,然后可以在创建后分配给特定的Course对象,以允许学生使用它来注册系统中的课程.
class CouponCode(ExtendedModel):
assigned_course = UniqueIDForeignKey("course.Course", blank=True, null=True, related_name='assigned_coupon_code_set')
...
...
@staticmethod
def assign_batch(c, upper_limit):
import course.models as cmod # Why is this allowed here?
assert isinstance(c, cmod.Course)
# Do other stuff here
Run Code Online (Sandbox Code Playgroud)
这种静态方法允许我传入一个课程对象和一些我想要分配给它的CouponCodes,然后它将为该课程分配下N个未分配的代码.我的问题来自断言.
我需要从course/models.py导入Course对象,以确保传入的对象实际上是Course的一个实例,但是如果我在文件顶部执行此操作,则会出现问题,因为此文件已经存在被导入到course/models.py中.(amod正被导入到cmod中,然后在amod中我需要导入cmod).
为什么它允许我这样做,如果我在我需要它之前在方法中导入它而不是在文件的顶部?
导入模块时(嗯,第一次在给定进程中导入它),将执行所有顶级语句(请记住这import
是一个可执行语句).所以你不能让module1 import module2
在顶层有一个语句,而module2 import module1
在顶层有一个- 它显然不起作用.
现在,如果在module2中移动import module1
函数中的语句,则在实际调用函数之前不会执行此语句,因此不会阻止module1导入module2.
请注意,这仍然被认为是不好的做法,大多数情况下循环依赖意味着您应该重构代码以避免问题(将两个模块所依赖的部分提取到依赖于两者的第三个模块,但其他模块都不依赖于,或者简单地合并模块) - 但是由于其他限制,某些情况很复杂,因此将此作为最后的解决方案很好.
此外,您不要需要导入模型引用它在一个ForeignKey
或Many2Many
现场-你可以传递一个"appname.ModelName"
字符串,比照https://docs.djangoproject.com/en/1.8/ref/models/fields/#foreignkey
要引用另一个应用程序中定义的模型,您可以使用完整的应用程序标签显式指定模型.例如,如果上面的制造商模型在另一个名为production的应用程序中定义,则需要使用:
Run Code Online (Sandbox Code Playgroud)class Car(models.Model): manufacturer = models.ForeignKey('production.Manufacturer')
在解析两个应用程序之间的循环导入依赖关系时,此类引用非常有用.
归档时间: |
|
查看次数: |
161 次 |
最近记录: |