摘要:類之間的循環依賴代碼大致是這樣的這樣,依賴,依賴,又會回到,這樣肯定就是錯誤的了。因為在引用的時候,會回到查找引用的,但是這個時候的構建還沒有完成,就會導入錯誤。也就是使用字符串表示模塊,而不進行導入了。
最近使用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
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/37320.html
摘要:是可視化工具中最棒的,但是,在處理視圖的導入導出方面,它是按照視圖名稱的字母順序來處理的,若視圖存在依賴,在導入過程中就會報錯。 navicat是mysql可視化工具中最棒的,但是,在處理視圖的導入導出方面,它是按照視圖名稱的字母順序來處理的,若視圖存在依賴,在導入過程中就會報錯。這個問題一直困繞我,一度因為我使用docker來部署mysql而繞過了這個問題。最近不得不直面這個問題,因...
摘要:注模板包含不存在此問題。在模板中,使用過濾器顯式地標記一個字符串為安全的臨時地完全禁用自動轉義系統。通過在聲明中直接添加或,當前的上下文可以傳遞到模板,而且不會自動禁用緩存。 官網:http://jinja.pocoo.org/docs/dev/中文文檔:http://docs.jinkan.org/docs/j...當前版本2.8 安裝:pip install Jinja2Flask...
摘要:假設我們需要在程序中計算一些數字的平方根。此外如果我們需要在程序中多次使用平方根函數,代碼將會更整潔。然而在這個虛構的例子中,只有的年齡超過歲。然后檢查這三個人的年齡是否滿足第二個條件。 作者:?Christopher Tao翻譯:王可汗校對:王雨桐本文約1800字,建議閱讀5分鐘本文...
摘要:記錄前段時間學習時遇到的循環導入問題何為循環導入栗子很簡單現在有三個包中導入中導入中導入然后隨便以一個文件為入口執行程序假如以作為程序入口大概就像下面這樣現在執行就會報出導入錯誤類似下面這個詳細介紹在核心編程中有介紹有時間可以看一下重點是 記錄前段時間學習 Flask 時遇到的循環導入問題 何為循環導入? 栗子很簡單, 現在有a.py, b.py, c.py 三個包, b.py 中導入...
閱讀 2866·2021-11-11 10:58
閱讀 1920·2021-10-11 10:59
閱讀 3489·2019-08-29 16:23
閱讀 2324·2019-08-29 11:11
閱讀 2785·2019-08-28 17:59
閱讀 3838·2019-08-27 10:56
閱讀 2049·2019-08-23 18:37
閱讀 3111·2019-08-23 16:53