我正在生成一个对象字段的参考编号。如果记录是新的,信号将在保存之前填充其他字段。如果记录不是新的,我也有一个操作。我将检查对象的特定字段,看看它是否更改并执行其他操作。
下面是信号函数的一个片段:
@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
。
当对象还没有保存的时候,它怎么能说对象已经创建了呢?