跟踪django中的m2m更新字段

时间:2015-12-07 14:56:43

标签: python django signals

我尝试使用信号跟踪m2m变化以创建活动历史记录,我使用django activity stream

我试图使用pre_save信号并比较字段的原始状态和实际状态,但由于某种原因我无法理解我的字段是无,即使它包含信息,这里是代码

@receiver(pre_save, sender=Artwork)
def artwork_update_handler(sender, instance, **kwargs):
    orig = Artwork.objects.get(pk=instance.pk)
    print (orig.collectors)
    print (instance.collectors)
    if orig.collectors != instance.collectors:
        print ("collectors diff")

我也试过使用m2m_changed信号,但是即使更新模型中的其他字段也发送信号,我不知道哪个字段是更新

2 个答案:

答案 0 :(得分:0)

跟踪m2m变化并不容易。之前我确实有类似的要求,我最终做的是使用django simple history包。它是一个简单跟踪模型对象的所有更改(创建,更新,删除)的包。但是,对于正常情况,m2m字段不明确存在,因此我添加了through模型仅用于历史记录跟踪。它可能有点过分取决于你想要这个功能有多糟糕,但绝对值得一试。

答案 1 :(得分:0)

m2m字段在保存时发送2个信号:“ pre_add”,“ post_add”,“ pre_remove”,“ post_remove”。没有pre_save。

因此它将看起来像这样:

@receiver(m2m_changed, sender=Artwork.the_m2m_field.through)
def artwork_update_handler(sender, instance, action, model, pk_set, **kwargs):
    if action == 'pre_save':
        orig = Artwork.objects.get(pk=instance.pk)
        print (orig.collectors)
        print (instance.collectors)
        if orig.collectors != instance.collectors:
            print ("collectors diff")