Метод сохранения модели перезаписи Django, чтобы проверить, изменилось ли поле «многие ко многим»

#python #django #model

Вопрос:

итак, у меня есть модель, для которой мне нужно перезаписать свойство save, чтобы проверить, изменилось ли отношение «многие ко многим». Обычно для такого поля символов вы могли бы сделать что-то вроде приведенного ниже, но для многих из многих это работает по-другому.

 class Interest(TimestampedModel):
    subjects = models.ManyToManyField('genre.Subject', blank=True)

    def save(self, *args, **kwargs):
        if self.id:
            old_subjects = Interest.objects.filter(pk=self.pk).first().subjects.all()
            subjects = self.subjects.all()
            if subjects != old_subjects:
                # Do stuff
 

Есть идеи, как сделать что-то подобное для поля «многие ко многим»?

Ответ №1:

Как насчет сигнала? Проверьте m2m_changed документы по сигналу здесь.

Вы можете использовать его как:

 from django.db.models.signals import m2m_changed

@receiver(m2m_changed, sender=Interest.subjects.through)
def video_category_changed(sender, instance, **kwargs):

    # do stuff to the Interest instance:
    instance...
 

Комментарии:

1. Это полезно, это действительно дает мне хорошее начало, но это не совсем тот ответ, который я ищу. Я виноват, что недостаточно описателен. Как бы это расширить, чтобы проверить переменные «old_subjects» и «new_subjects», как в моем примере. Мне нужно иметь доступ как к старым предметам, так и к новым предметам после изменения m2m для действия, которое я хочу выполнить.

2. Есть pre_add , post_add , pre_remove , и post_remove кварги — я не использовал их раньше, но, согласно документам, похоже, вы можете использовать их для решения своей проблемы.