Если возможно в вашем случае, вы можете ввести модель Участие
, которая объединит событие и пользователя:
class Participation(models.Model):
user = models.ForeignKey(User)
event = models.ForeignKey(Event)
class Event(models.Model):
users = models.ManyToManyField(User, through='Participation')
и обработает сигнал pre_save, отправленный Участие
для обновления instance.event
counts. Это значительно упростило бы обращение с m2m. И в большинстве случаев позже оказывается, что некоторая логика и данные лучше всего подходят для средней модели. Если это не ваш случай, попробуйте другое решение (в любом случае у вас не должно быть много путей кода, добавляющих пользователей к событиям).
Переопределяющее save() может не помочь, так как обновление М2М не является атомарным и происходит после сохранения экземпляра Event (я не изучал семантику delete(), но они, вероятно, похожи). Об этом шла речь в другом потоке .
Люди говорят и работают над этой проблемой. Лучшее решение, которое я видел до сих пор, это этот MonkeyPatch от gregoirecachet. Я не знаю, превратится это в 1.2 или нет. Наверное, нет, так как Release Manager (Джеймс Беннетт) пытается заставить людей уважать даты заморозки (только что прошла главная).
.Для этого существует "шаблон проектирования".
В основном, переопределение save()
и delete()
.
Как говорится, использование слушателей тоже вариант, но для этого сценария механизм переопределения мне нравится больше.
.