Django: Выполнение действий после создания или обновления объекта
У меня есть модель под названием EventMembership, которая определяет, присутствует ли кто-то на мероприятии или нет:-
class EventMembership(models.Model):
user = models.ForeignKey(User, related_name='eventmemberships')
is_attending = models.BooleanField()
У меня также есть модель EventFee, которая используется для отслеживания платежей пользователей за мероприятия:-
class EventFee(models.Model):
user = models.ForeignKey(User, related_name='eventfees')
amount = models.DecimalField()
Если пользователь посещает мероприятие, то он должен иметь плату по цене этого мероприятия. Если нет, то они не должны иметь плату.
Каким образом мне лучше всего управлять созданием, обновлением или удалением этих сборов?
Я видел много людей, предостерегающих от использования сигналов, и у меня были проблемы с сигналами в прошлом, но они кажутся идеальным решением.
Я полагаю, что это сигналы или переопределение метода save() в модели, не так ли? Но переопределение метода save() означает, что плата будет обновляться каждый раз при сохранении модели, что кажется мне плохим вариантом.
Есть другие предложения?
Примечание: я использую Django Rest Framework для этого, поэтому эти EventMemberships могут быть созданы, обновлены или удалены через него. Но они также могут быть обновлены с помощью нескольких других механизмов, например, пользователь удаляет свой аккаунт - при этом все его членства для будущих событий будут установлены на "не посещает", поэтому я не уверен, что мне следует создавать членства и т.д. в сериализаторе или представлении.
1- Я вижу недостающее поле в модели EventFee
. Согласно вашему описанию EventFee
не будет существовать, если нет вложенного EventMembership
. Поэтому я ожидаю, что там будет внешний ключ (может быть заменой пользователя, который потенциально может быть получен через membership
).
class EventFee(models.Model):
membership = models.ForeignKey(EventMembership, related_name='eventfees', on_delete=models.CASCADE)
amount = models.DecimalField()
добавление on_delete=models.CASCADE
обеспечит удаление платы при удалении membership
.
2- Создание и обновление сборов можно просто централизовать в EventMembershipSerializer
, переопределив методы create(when is_attending
is true)/update(if is_attending
changed). Это может быть более простым в обслуживании, если вы хотите избежать сигналов, и даст вам некоторую гибкость, если вы хотите делать это через EventFeeSerializer.
3-
Я полагаю, что это сигналы или переопределение метода save() на модели, не так ли? Но переопределение метода save() означает, что плата будет обновляются каждый раз при сохранении модели
.
Если пройтись по модели, можно сравнить текущее и новое значения для is_attending
и проверить, является ли операция созданием или обновлением (аналогично логике в пункте 2). Это позволит обновлять сборы только при необходимости.