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

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

Предыдущий экземпляр модели либо будет удален, и будет создан новый экземпляр, либо предыдущий экземпляр будет обновлен.

Мои модели:

class Sales(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)
    party_ac        = models.ForeignKey(Ledger1,on_delete=models.CASCADE,related_name='partyledgersales')
    sales           = models.ForeignKey(Ledger1,on_delete=models.CASCADE,related_name='saleledger')
    date            = models.DateField(default=datetime.date.today,blank=False, null=True)
    sub_total       = models.DecimalField(max_digits=10,decimal_places=2,blank=True, null=True)

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')
    voucher_id      = models.PositiveIntegerField(blank=True,null=True)
    date            = models.DateField(default=datetime.date.today)
    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)

Мой сигнал pre_save для создания:

@receiver(pre_save, sender=Sales)
def user_created_sales(sender,instance,*args,**kwargs):
    if instance.sub_total != None:
            Journal.objects.update_or_create(user=instance.user,company=instance.company,date=instance.date,voucher_id=instance.id,by=instance.party_ac,to=instance.sales,debit=instance.sub_total,credit=instance.sub_total)

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

Есть идеи, как это сделать?

Спасибо

1 Ответ

1 голос
/ 27 марта 2019

update_or_create принимает два набора параметров:

  • kwargs, которые являются параметрами, которые однозначно определяют строку для выборки из базы данных
  • defaults, которые являютсяпараметры, которые должны быть обновлены

В данный момент вы никогда не обновляете существующие экземпляры Journal, поскольку вы не указали defaults.Вы ищете экземпляры, которые соответствуют всем параметрам, если он существует, вы ничего не делаете, если он не существует, вы его создаете.

Вы не сказалинам, что делает запись Journal уникальной (и как она относится к записи Sales, поскольку между ними нет отношения ForeignKey). update : с voucher_id теперь у вас есть способ поиска соответствующих Journal записей.

Но что-то вроде:

Journal.objects.update_or_create(
    user=instance.user,
    company=instance.company,
    voucher_id=instance.id,
    defaults={
        'date': instance.date,
        'debit': instance.sub_total,
        'credit': instance.sub_total,
        'by': instance.party_ac,
        'to': instance.sales}
)

будет искать существующиеэкземпляр с теми же user, company и voucher_id и обновите date, by, to, credit и debit.

...