0

I have model:

class UserAvailableCredit(models.Model):

    user = models.ForeignKey(
        "auth_ex.User",
        related_name="credits",
        on_delete=models.CASCADE,
    )
    payment = models.ForeignKey(
        Payment,
        related_name="credits",
        on_delete=models.CASCADE,
    )
    project = models.ForeignKey(
        Project,
        related_name="credits",
        on_delete=models.CASCADE,
        null=True,
        blank=True,
    )

and on this model I make various actions like:

  1. Bulk creating
  2. Deleting
  3. Updating etc.

is there any way to have one method that on any change of model triggers action?

  1. Overwriting save method doesn't solve problem when bulk_create action is triggered.

In my solution I have done something like this:

class UserAvailableCreditQuerySet(QuerySet):
    def update(self, **kwargs):
        notify = kwargs.pop("notify", False)
        if notify:
          #custom action

    def bulk_create(self, objs, batch_size=None):
        super().bulk_create(objs, batch_size)
        #custom action


class UserAvailableCredit(models.Model):
    """Model to store available users credits to use with plan limitations."""

    objects = UserAvailableCreditQuerySet.as_manager()
    user = models.ForeignKey(
        "auth_ex.User",
        related_name="credits",
        on_delete=models.CASCADE,
    )
    payment = models.ForeignKey(
        Payment,
        related_name="credits",
        on_delete=models.CASCADE,
    )
    project = models.ForeignKey(
        Project,
        related_name="credits",
        on_delete=models.CASCADE,
        null=True,
        blank=True,
    )

    class Meta:
        ordering = ["id"]

    def save(self, *args, **kwargs):
        super().save(*args, **kwargs)
        #custom action

    def create(self, *args, **kwargs):
        super().create(*args, **kwargs)
        #custom action

    def delete(self, *args, **kwargs):
        super().delete(*args, **kwargs)
        #custom action

But I am not sure if it is best way to solve this problem.

0 Answers0