2012-10-02 77 views
4

我想使用m2m_changed signal來觸發我的應用程序 中的一些操作。但是,signaltest()的打印輸出表明我只在pre_clearpost_clear行動上發出信號。我models.py看起來是這樣的:django m2m_changed通過模型自定義信號

class Entry(models.Model): 
    objects = managers.MyEntryManager() 
    ... 
    fields = models.ManyToManyField('Field', through='EntryField') 

class Field(models.Model): 
    name = models.CharField(max_length=64, unique=True) 
    description = models.CharField(max_length=256, blank=True) 

class EntryField(models.Model): 
    entry = models.ForeignKey('Entry') 
    field = models.ForeignKey('Field') 
    value = models.CharField(max_length=256) 

def signaltest(**kwargs): 
    print kwargs['action'] 
signals.m2m_changed.connect(signaltest, sender=Entry.fields.through, weak=False, dispatch_uid='signaltest') 

EntryField對象在使用下面的代碼的代碼別處創建:

some_entry.fields.clear() 
models.EntryField.objects.get_or_create(
    entry=some_entry, 
    field=some_field, 
    defaults = { 'value': field_value } 
) 

第一個電話就是負責我收到pre_clearpost_clear事件。但是,第二次調用不會產生信號。

在我看來,django bug #13757與此(錯誤)行爲有關,但我可能會遺漏一些東西。

有一種方法,以「重新佈線」的信號(可能使用比m2m_changed一些其它信號),以產生具有信號post_save創建EntryField時?

+3

是否有某些原因導致您不能將信號處理程序連接到post_save? –

+0

'm2m_changed'看起來更合適。如果我解釋了以下行爲,我不介意使用'post_save'信號:當連接到'post_save'並打印'kwargs'時,我得到'TypeError:'str'對象不可調用'。錯誤是在打印kwargs ['instance']'時產生的。奇怪的是,如果我只是使用'kwargs ['instance']'而不打印它,那麼就沒有問題。這讓我對是否應該以這種方式使用'post_save'有點懷疑。 – m000

+0

@ChrisLawlor好的。我解決了TypeError問題。畢竟這是我的錯 - 在實現'EntryField .__ unicode__'(上面未顯示)時錯過了'%'。謝謝! – m000

回答

0

你可以試試這個嗎?

def signaltest(**kwargs): 
    print kwargs['instance'] 
    print kwargs['created'] 

signals.post_save.connect(signaltest, sender=EntryField, weak=False, dispatch_uid='signaltest') 
+0

'action'參數特定於'm2m_changed'信號。所以,你的代碼段(連接到'post_save'信號)會拋出一個異常。你確定你沒有輸錯任何東西嗎? – m000