跟踪Django中的m2m更新字段



我试图用信号跟踪m2m的变化以创建活动历史,我使用django活动流

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

@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信号,但即使在更新模型中的其他字段时也会发送信号,并且我不知道哪些字段正在更新

跟踪m2m的更改并不容易。我以前也有类似的要求,我最终使用的是django简单历史包。它是一个包,只需跟踪模型对象上的所有更改(创建、更新、删除)。然而,对于正常情况,m2m字段并不明确存在,所以我添加了一个直通模型,仅用于历史跟踪。这可能有些过头了,这取决于你对这个功能的需求有多大,但绝对值得一试。

m2m字段在保存时发送两个信号:‘pre_add’、‘post_add’,‘pre_remove’和‘post_remove‘。没有预保存(_S)。

因此,它看起来像这样:

@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")

最新更新