Django 发出信号创建值错误返回

问题描述 投票:0回答:0

我正在生成对象字段的参考编号。如果记录是新的,信号将在保存前填充其他字段。如果记录不是新的,我也有一个行动。我会检查一个对象的特定字段,看看它是否改变了,然后做一些其他的动作。

这里是信号函数的片段:

@receiver(pre_save, sender=ProofOfPayment)
def pre_save_for_proof_of_payment(sender, instance, created=False, **kwargs):
    print('created', created)
    if created:
        upload_date = datetime.datetime.now().strftime('%Y%m%d%H%M%S')
        reference_number = 'PAYMENT-' + upload_date
        instance.reference_number = reference_number
        received = PaymentStatus.objects.get(pk=1) # Received
        instance.payment_status = received
    else:
        obj = sender.objects.get(pk=instance.pk)
        if not obj.payment_status == instance.payment_status:
            if instance.payment_status.name == 'Completed':
                instance.expiry_date = datetime.datetime.now() + datetime.timedelta(days=30)

我正在模拟管理员中的过程。我创造了一个新记录。当我创建新对象时,我得到一个错误,因为变量

created
被设置为
False
,在片段中执行 else 函数。

obj = sender.objects.get(pk=instance.pk) 

ProofOfPayment matching query does not exist.

我不确定为什么

created
值设置为
False
即使记录是新的。

当我没有在函数中放置默认值时:

def pre_save_for_proof_of_payment(sender, instance, created, **kwargs):

我得到这个错误:

pre_save_for_proof_of_payment() missing 1 required positional argument: 'created'

当我将默认值设置为

created=True
时,制作新记录时信号不会被触发。

我对如何使用

created
论点感到困惑。我所知道的是 Django 将根据记录是否新提供布尔值。但在这种情况下,一旦创建新记录,它就会采用默认值。

我默认创建的布尔值应该是什么,以便我知道何时在

if created:
代码块中有这样的新记录,以及何时记录不是新的,以便触发诸如在
else
代码块中的动作。

我的模型是这样的。

class ProofOfPayment(models.Model):
    reference_number = models.CharField(max_length=500, blank=True)
    user = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        null=True,
        blank=True,
        on_delete=models.SET_NULL)
    payment_type = models.ForeignKey(
        PaymentType,
        on_delete=models.SET_NULL,
        null=True,
        blank=True,)
    payment_status = models.ForeignKey(
        PaymentStatus,
        on_delete=models.SET_NULL,
        null=True,
        blank=True,)
    receipt = models.FileField(
        upload_to='userproofofpayment',
        null=True,
        max_length=500)
    remarks = models.TextField(max_length=250, blank=True)
    upload_date = models.DateTimeField(auto_now_add=True)
    expiry_date = models.DateTimeField(blank=True, null=True)

    def __str__(self):
        return self.reference_number
django django-signals
© www.soinside.com 2019 - 2024. All rights reserved.