#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
кварги — я не использовал их раньше, но, согласно документам, похоже, вы можете использовать их для решения своей проблемы.