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



我正在生成一个对象字段的参考编号。如果记录是新的,信号将在保存之前填充其他字段。如果记录不是新的,我也有一个操作。我将检查对象的特定字段,看看它是否更改并执行其他操作。

下面是信号函数的一个片段:

@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

pre_save信号中没有created参数。对于这样的逻辑,您必须使用post_save

当对象还没有保存的时候,它怎么能说对象已经创建了呢?

最新更新