Django项目不同app模型互设外键触发循环导入问题如何解决
Django跨应用模型循环导入解决方案
你遇到的是Django多应用模型互相引用时非常常见的循环导入问题,按照以下步骤修改即可解决:
修改步骤
1. 调整front应用的models.py代码
- 移除
lrnadmin模型的导入语句:删除from lrnadmin.models import Qualification这一行 - 外键字段改用字符串形式引用目标模型:
将lrnQ = models.ForeignKey(Qualification, on_delete= models.CASCADE)
修改为lrnQ = models.ForeignKey("lrnadmin.Qualification", on_delete= models.CASCADE)
2. 调整lrnadmin应用的models.py代码
- 移除
front模型的导入语句:删除from front.models import User这一行 - 外键字段改用字符串形式引用目标模型:
将user = models.ForeignKey(User, on_delete= models.CASCADE)
修改为user = models.ForeignKey("front.User", on_delete= models.CASCADE)
原理解释
Django原生支持用应用名.模型类名格式的字符串来指定外键关联的模型,不需要在定义模型的时候就导入对应的类。框架会在所有模型加载完成后自动解析字符串找到对应的模型,从根源上避免了两个模型文件互相导入的循环依赖问题。
注意事项
- 字符串中的应用名必须和
settings.py的INSTALLED_APPS里注册的应用名完全一致,模型类名也需要和目标类的名称完全匹配,大小写敏感 - 该用法同样适用于
OneToOneField、ManyToManyField等所有关联字段 - 同应用内的模型互相引用,直接写模型类名的字符串即可,不需要加应用名前缀
内容的提问来源于stack exchange,提问作者Habib Ur Rehman
相关产品推荐
相关产品推荐

