Django 在创建模型时使用什么算法来解决循环导入?
What algorithm does Django use to resolve circular imports when creating models?
使用外键定义模型时,Django 要求用户specify them as strings 以避免循环依赖问题。
解析字符串后创建相关模型的算法是什么?我已经浏览过 Django's source code 但没能理解它。
我认为它会根据模型创建一个图形,对其进行拓扑排序,然后从实例化不依赖于其余模型的模型开始。然而,这似乎太简单了,因为图形可能不是 DAG,如下例所示:
class ModelA:
b = ForeignKey(ModelB)
class ModelB:
c = ForeignKey(ModelC)
class ModelC:
a = ForeignKey(ModelA)
谢谢!
当你传递一个字符串时,Django 首先尝试查找模型。如果存在并且已注册,则立即将其替换。
如果模型尚未注册,则向应用注册表添加惰性操作。例如,this method 用于求解关系的 to
部分。 to
属性被替换为实际模型,反向关系被添加到 to
模型。
每当定义新模型 class 时,元class 就会在应用注册表中注册该模型。应用程序注册表会遍历该模型的待处理操作列表,并触发每个操作。
因此,对于每个有效的字符串引用,当字段被实例化时,目标要么存在并且字符串立即被模型替换class,要么目标尚不存在,但是一个惰性操作用于在创建和注册模型 class 时用模型 class 替换字符串。
如果你有一个循环引用,比如说,2 个模型,第一个模型 class 将添加一个惰性操作。第二个模型class可以立即解析它对第一个模型class的引用,然后激活惰性操作来解析从第一个模型class到第二个模型[=24=的引用].
使用外键定义模型时,Django 要求用户specify them as strings 以避免循环依赖问题。
解析字符串后创建相关模型的算法是什么?我已经浏览过 Django's source code 但没能理解它。
我认为它会根据模型创建一个图形,对其进行拓扑排序,然后从实例化不依赖于其余模型的模型开始。然而,这似乎太简单了,因为图形可能不是 DAG,如下例所示:
class ModelA:
b = ForeignKey(ModelB)
class ModelB:
c = ForeignKey(ModelC)
class ModelC:
a = ForeignKey(ModelA)
谢谢!
当你传递一个字符串时,Django 首先尝试查找模型。如果存在并且已注册,则立即将其替换。
如果模型尚未注册,则向应用注册表添加惰性操作。例如,this method 用于求解关系的 to
部分。 to
属性被替换为实际模型,反向关系被添加到 to
模型。
每当定义新模型 class 时,元class 就会在应用注册表中注册该模型。应用程序注册表会遍历该模型的待处理操作列表,并触发每个操作。
因此,对于每个有效的字符串引用,当字段被实例化时,目标要么存在并且字符串立即被模型替换class,要么目标尚不存在,但是一个惰性操作用于在创建和注册模型 class 时用模型 class 替换字符串。
如果你有一个循环引用,比如说,2 个模型,第一个模型 class 将添加一个惰性操作。第二个模型class可以立即解析它对第一个模型class的引用,然后激活惰性操作来解析从第一个模型class到第二个模型[=24=的引用].