Python 在Django中跟踪m2m更新字段

Python 在Django中跟踪m2m更新字段,python,django,signals,Python,Django,Signals,我试图用信号跟踪m2m的变化,以创建活动历史记录,我正在使用 我曾尝试使用pre_save信号并比较字段的原始状态和实际状态,但由于一个原因,我无法理解我的字段是“无”,即使它包含信息,下面是代码 @receiver(pre_save, sender=Artwork) def artwork_update_handler(sender, instance, **kwargs): orig = Artwork.objects.get(pk=instance.pk) print (o

我试图用信号跟踪m2m的变化,以创建活动历史记录,我正在使用

我曾尝试使用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_更改的信号,但即使在更新模型中的其他字段时也会发送信号,我不知道哪些字段正在更新。跟踪m2m更改并不容易。我以前也有类似的要求,我最后做的就是使用这个包。它是一个只跟踪模型对象上所有更改(创建、更新、删除)的包。但是,对于正常情况,m2m字段并不显式存在,因此我添加了一个仅用于历史跟踪的模型。这可能有点过分,这取决于您对该功能的需求程度,但绝对值得尝试一下。

跟踪m2m的更改并不是那么容易。我以前也有类似的要求,我最后做的就是使用这个包。它是一个只跟踪模型对象上所有更改(创建、更新、删除)的包。但是,对于正常情况,m2m字段并不显式存在,因此我添加了一个仅用于历史跟踪的模型。这可能有点过分,这取决于您对该功能的需求程度,但绝对值得尝试一下。

m2m字段在保存时发送两个信号:“添加前”、“添加后”、“删除前”、“删除后”。没有预存

因此,它看起来像这样:

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

m2m字段在保存时发送2个信号:“添加前”、“添加后”、“删除前”、“删除后”。没有预存

因此,它看起来像这样:

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