2012-10-02 45 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