django m2m_通过定制型号更改信号

django m2m_通过定制型号更改信号,django,django-models,django-signals,Django,Django Models,Django Signals,我正在尝试使用触发应用程序中的某些操作 . 但是,signaltest()的打印输出表明,我只在pre\u clear和post\u clear操作上收到信号。我的models.py如下所示: class Entry(models.Model): objects = managers.MyEntryManager() ... fields = models.ManyToManyField('Field', through='EntryField') class Fiel

我正在尝试使用触发应用程序中的某些操作 . 但是,
signaltest()
的打印输出表明,我只在
pre\u clear
post\u clear
操作上收到信号。我的
models.py
如下所示:

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\u clear
post\u clear
事件。但是,第二次呼叫不产生信号

在我看来,这似乎与这种(错误的)行为有关,但我可能遗漏了一些东西


是否有一种方法可以“重新布线”信号(可能使用除
m2m\u changed
以外的其他信号),以便在创建
入口字段时生成
post\u save
信号?

您能尝试一下吗

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

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

有什么原因不将信号处理程序连接到post_save吗?
m2m_changed
看起来更合适。如果我对以下行为有一个解释,我不介意使用
post\u save
信号:当连接到
post\u save
并打印
kwargs
时,我得到一个
TypeError:“str”对象不可调用。错误是在打印
kwargs['instance']
时生成的。奇怪的是,如果我只使用
kwargs['instance']
而不打印它,就不会有问题。这使我对是否应该以这种方式使用
post\u save
有点怀疑。@ChrisLawlor Ok。我解决了
TypeError
问题。毕竟是我的错-在
入口字段的实现中错过了
%
。\uuuuuunicode\uuuuuuu
(上面未显示)。谢谢
action
参数特定于
m2m\u changed
信号。因此,您的代码段(连接到
post\u save
signal)抛出异常。你确定没有打错字吗?