Почему я все еще получаю старые значения для сравнения ManyToManyField? - PullRequest
0 голосов
/ 16 июня 2020

Я нашел много способов сделать это, но вроде ничего не работает. У меня есть модель, которая имеет manytomanyfield с другой моделью, я хочу иметь возможность сравнивать старые значения из поля manytomany и новые.

class A(models.Model):
    registers = models.ManyToManyField('B',blank=True)

    def save(self,*args,**kwargs):
        try:
            old_registers = self.__class__.objects.get(pk=self.pk).registers.all()
            print(old_registers)
            print(old_registers.difference(self.registers.values_list()))
        except A.DoesNotExist:
            old_registers = None

        if (old_registers != None) and old_registers.difference(self.registers.values_list()):
            print("Values changed")

class B(models.Model):
    name = models.CharField(max_length=32)

Обратите внимание, что я взаимодействую с моделями в Django Admin.

Когда я сохраняю экземпляр, я всегда получаю старые значения для self.__class__.objects.get(pk=self.pk).registers.all() и self.registers.all(), и кажется, что новые значения (новые выбранные экземпляры) никогда не приходят.

1 Ответ

0 голосов
/ 17 июня 2020

Для тех, кто сталкивается с той же проблемой, я использую m2m_changed signal ( Документация здесь ). Этот сигнал запускается при любом изменении в поле многие ко многим ....

@receiver(m2m_changed, sender=A.registers.through)
def function_to(sender, instance, model, pk_set, action, **kwargs):
    ''' '''
    if action == 'post_add':
        pass
...