Django Как обновить данные некоторых определенных полей после ввода из другой модели с помощью сигналов

У меня есть некоторая проблема с сигналами django. Я хочу обновить поля модели статуса PermohonanWP с 'PROSES' на 'SUCCESS' после ввода данных в PenelitiPemindahanWP. (Предположим, что я уже ввел данные в модель PermohonanWP со статусом = 'PROSES')

здесь мой model.py

class PermohonanWP(models.Model):
      npwp = models.CharField(max_length=15, null=False)
      nama = models.CharField(max_length=100, null=False)
      status = models.CharField(max_length=20, null=True)

class PenelitiPemindahanWP(models.Model):
      permohonan_pemindahan = models.ForeignKey(PermohonanWP, on_delete=models.CASCADE)
      nomor_lhp = models.IntegerField(null=True)
      nomor_st = models.CharField(max_length=50, null=True)

вот мои сигналы, которые я ввел в model.py

@receiver(post_save, sender=PenelitiPemindahanWP, dispatch_uid="update_permohonan_id")
def update_permohonan(sender, instance, **kwargs):
    pemohon = PermohonanWP.objects.get(id=instance.permohonan_pemindahan)
    pemohon.status = "SUCCESS"
    pemohon.save()

Я хочу обновить поле статуса из PermohonanWP, но когда я отправляю кнопку сохранения, оно не сохраняется и не обновляет поля.

Исправьте это

pemohon = PermohonanWP.objects.get(id=instance.permohonan_pemindahan)

to

pemohon = PermohonanWP.objects.get(id=instance.permohonan_pemindahan.id)

ИЛИ

Даже просто :

pemohon = instance.permohonan_pemindahan

Вам необходимо импортировать ваши сигналы в apps config ready method

apps.py

from django.apps import AppConfig

class <App_name>Config(AppConfig):
    name = '<app name>'

    def ready(self): 
        import <app name>.signals

и ваш сигнал должен выглядеть как

@receiver(post_save, sender=PenelitiPemindahanWP, dispatch_uid="update_permohonan_id")
def update_permohonan(sender, instance, **kwargs):
    pemohon = PermohonanWP.objects.get(id=instance.permohonan_pemindahan.id)
    pemohon.status = "SUCCESS"
    pemohon.save()

Надеемся, что это сработает.


Совет:

Будет лучше, если вы будете использовать варианты для поля статуса.

На мой взгляд, всегда, когда это возможно, для хранения информации о состоянии какого-либо ресурса следует использовать целые числа. У такого решения есть большое преимущество. После добавления индекса базы данных к этому полю, производительность поиска будет более эффективной при использовании целочисленного поля вместо char-поля. Еще одним преимуществом является то, что мы можем манипулировать упорядочиванием в таком поле. Например: В модели есть поле статуса с допустимыми вариантами: New = 1, Draft = 2, Published = 3. Если мы хотим упорядочить экземпляры Django модели по статусу от нового созданного до опубликованного, то теперь мы можем легко добавить порядок по этому полю (возрастающий по целочисленному полю). ref

Один подход;

models.py

    ...
    # status
    PENDING = 1
    PROCESSING = 2
    DELIVERED = 3
    CANCELED = 4

    ORDER_STATUS = [
        (PENDING, 'Pending'),
        (PROCESSING, 'Processing'),
        (DELIVERED, 'Delivered'),
        (CANCELED, 'Canceled')
    ]

    status = models.PositiveSmallIntegerField(choices=ORDER_STATUS, default=PENDING)
   ...
Вернуться на верх