2010-12-08 87 views
3

我有一個myapp/management/__init__.py被註冊post_syncdb處理,像這樣:Django post_syncdb信號處理程序沒有被調用?

from django.db.models import signals 
from features import models as features 

def create_features(app, created_models, verbosity, **kwargs): 
    print "Creating features!" 
    # Do stuff... 

signals.post_syncdb.connect(create_features, sender=features) 

我已經驗證了以下內容:

  1. 兩個featuresmyappsettings.INSTALLED_APPS
  2. myapp.management之前是越來越加載到syncdb運行(通過模塊級別的打印語句驗證)
  3. features應用程序正在通過syncdb進行處理,並且它發出了一個post_syncdb信號(通過檢查syncdb的輸出與--verbosity=2進行驗證。
  4. 我對另一對應用程序使用完全相同的成語,並且正確調用該處理程序。我比較了兩個模塊,發現調用之間沒有相關的區別。

但是,myapp.management.create_features永遠不會被調用。我錯過了什麼?

+0

這個問題是從2010年。請參閱這裏的解決方案在2016年有效:http://stackoverflow.com/a/32446857/633961 – guettli 2016-10-19 09:57:31

回答

3

嘗試把它在你的models.py

+2

這將技術上的工作,我想,所以我會接受它作爲一個答案,但根據文檔,這確實屬於管理層次結構中的某個位置:http://docs.djangoproject.com/en/dev/ref/signals/#post-syncdb – 2011-01-15 16:41:10

0

點是在sender。只有在sender計算出來後,纔會調用您的自定義回調。在我的情況下,senderdb.models,如果syncdb不是第一次調用i.o.同步模型存在於數據庫中。在它寫的文件中,但沒有提出適當的重點。

發件人

剛安裝該機型模塊。也就是說,如果syncdb剛剛安裝了名爲「foo.bar.myapp」的應用程序,發件人將是foo.bar.myapp.models模塊。

所以我的解決方案是放下數據庫並再次安裝我的應用程序。

1

剛剛遇到同樣的問題,我解決它的方式是從函數參數中刪除sender並在回調函數中檢查它。

from django.db.models import signals 
from features import models as features 

def create_features(app, created_models, verbosity, **kwargs): 
    print "Creating features!" 
    if app != features #this will work as it compares models module instances 
     return 
    # Do stuff... 

signals.post_syncdb.connect(create_features) 

這樣你可以讓它們保持在你的管理模塊中,就像Django文檔提示的那樣。我同意它應該像你所建議的那樣工作。您可以深入探究django.dispatch中Signal類的實現。