django m2m_changed信号与定制通过模型

时间:2012-10-02 11:52:40

标签: django django-models django-signals

我正在尝试使用m2m_changed signal来触发我的应用程序中的某些操作 。但是,signaltest()的打印输出表明我仅在pre_clearpost_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_clearpost_clear事件负责。但是,第二次调用不会产生任何信号。

在我看来,django bug #13757与此(错误)行为有关,但我可能会遗漏某些内容。

有没有办法“重新连接”信号(可能使用m2m_changed以外的某些信号),以便在创建post_save时生成EntryField信号?

1 个答案:

答案 0 :(得分:0)

你可以试试这个吗?

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

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