I am trying to use m2m signals to copy some data from a M2M field to another if a conditional is met. From logs I can see that the signal works as expected but when I query the DB I do not see any data - while I would expect to see the same as I see in the logs.
models.py
class NatObjectLocal(PrimaryModel):
"""NAT Object Local model implementation."""
nat_type = models.CharField(max_length=200, choices=NatTypes, verbose_name="Local NAT")
real_ip = models.ManyToManyField(
to="ipam.IPAddress",
related_name="real_ips_local",
)
local_routable_ip = models.ManyToManyField(
to="ipam.IPAddress",
related_name="routable_ips_local",
)
@receiver(m2m_changed, sender=NatObjectLocal.real_ip.through)
def copy_real_ip(sender, instance, action, **kwargs):
if action == "post_add":
if instance.nat_type == NatTypes.ECN:
instance.local_routable_ip.clear()
real_ips = instance.real_ip.all()
print(f"real_ips: {real_ips}")
instance.local_routable_ip.add(*real_ips)
instance.save()
print(f"instance.local_routable_ip.all(): {instance.local_routable_ip.all()}")
debug output
real_ips: <IPAddressQuerySet [<IPAddress: 10.0.0.1/32>]>
instance.local_routable_ip.all(): <IPAddressQuerySet [<IPAddress: 10.0.0.1/32>]>
ORM output
In [16]: related_objects = a.real_ip.all()
In [17]: related_objects
Out[17]: <IPAddressQuerySet [<IPAddress: 10.0.0.1/32>]>
In [18]: related_objects_2 = a.local_routable_ip.all()
In [19]: related_objects_2
Out[19]: <IPAddressQuerySet []>