我正在生成对象字段的参考编号。如果记录是新的,信号将在保存前填充其他字段。如果记录不是新的,我也有一个行动。我会检查一个对象的特定字段,看看它是否改变了,然后做一些其他的动作。
这里是信号函数的片段:
@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