Django: Как создать сигнал для удаления экземпляра сигнала pre_save? - PullRequest
0 голосов
/ 28 марта 2019

В моих моделях есть следующий сигнал pre_save:

@receiver(pre_save, sender=Purchase)
def user_created_purchase_cgst(sender,instance,*args,**kwargs):
    c = Journal.objects.filter(user=instance.user, company=instance.company).count() + 1
    if instance.cgst_alltotal != None and instance.cgst_alltotal != 0:
        Journal.objects.update_or_create(
            user=instance.user,
            company=instance.company,
            by=ledger1.objects.filter(user=instance.user,company=instance.company,name__icontains='CGST').first(),
            to=instance.party_ac,
            defaults={
                'counter' : c,
                'date': instance.date,
                'voucher_id' : instance.id,
                'voucher_type' : "Journal",
                'debit': instance.cgst_alltotal,
                'credit': instance.cgst_alltotal}
            )

Я хочу создать еще один сигнал, аналогичный описанному выше, что при удалении отправителя также удаляется экземпляр отправителя.

Т.е. при удалении объекта Purchase соответствующий объект Journal, созданный с помощью сигнала pre_save, будет удален.

Кто-нибудь знает, как это сделать?

Спасибо

1 Ответ

2 голосов
/ 28 марта 2019

Это будет примерно так:

@receiver(pre_delete, sender=Purchase)
def delete_related_journal(sender, instance, **kwargs):
    journal = instance.journal # instance is your Purchase instance that is
    # about to be deleted
    journal.delete()

Но имейте в виду, что если для внешнего ключа покупки журнала установлено значение on_delete=models.CASCADE, вам вообще не нужно этого делать. Так что, если CASCADE не установлен, вы можете вместо этого сделать это, используя сигнал.

class JournalModel(models.Model):
    # Your other fields here
    purchase = models.ForeignKey(Purchase, on_delete=models.CASCADE)

Подробнее о pre_delete сигналах: документы

...