0

I tried this answer https://stackoverflow.com/a/28369908/9902571 in my model and done the following :-

from functools import wraps

def prevent_recursion(func):

        @wraps(func)
        def no_recursion(sender, instance=None, **kwargs):

            if not instance:
                return

            if hasattr(instance, '_dirty'):
                return

            func(sender, instance=instance, **kwargs)

            try:
                instance._dirty = True
                instance.save()
            finally:
                del instance._dirty

        return no_recursion

My model:

class Journal(models.Model):
    user            = models.ForeignKey(settings.AUTH_USER_MODEL,on_delete=models.CASCADE,null=True,blank=True)
    company         = models.ForeignKey(company,on_delete=models.CASCADE,null=True,blank=True,related_name='Companyname')
    date            = models.DateField(default=datetime.date.today)
    voucher_id      = models.PositiveIntegerField(blank=True,null=True)
    by              = models.ForeignKey(ledger1,on_delete=models.CASCADE,related_name='Debitledgers')
    to              = models.ForeignKey(ledger1,on_delete=models.CASCADE,related_name='Creditledgers')
    debit           = models.DecimalField(max_digits=10,decimal_places=2,null=True)
    credit          = models.DecimalField(max_digits=10,decimal_places=2,null=True)

My signal:

@receiver(post_save, sender=journal)
@prevent_recursion
def pl_journal(sender, instance, created, **kwargs):
    if created:
        if instance.by.group1_Name.group_Name == 'Indirect Expense':
            Journal.objects.update_or_create(user=instance.user,company=instance.company,date=instance.date, voucher_id=instance.id, voucher_type= "Journal",by=instance.by,to=ledger1.objects.filter(user=instance.user,company=instance.company,name__icontains='Profit & Loss A/c').first(),debit=instance.debit,credit=instance.credit)

But the RecursionError of maximum recursion depth exceeded while calling a Python object stills comes while creating a journal object.

I want to pass the post_save signal for the same model (Journal) which when matches the condition in the signal gets called recursively.

Any anyone tell me what is wrong in my code?

Thank you

Niladry Kar
  • 1,163
  • 4
  • 20
  • 50

1 Answers1

0

It is a little late but it may help others too. Instead of this, you can add dispatch_uid="identifier" to signal and it will work fine.

post_save.connect(function_name, sender=Model, dispatch_uid="identifier")

or

@receiver(post_save, sender=Model, dispatch_uid="identifier")

doc: https://docs.djangoproject.com/en/4.1/topics/signals/#preventing-duplicate-signals

Bairam
  • 1
  • 2