Django用原始d更新模型

2024-04-20 01:23:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我有这个模型,在保存时自动生成发票号码。你知道吗

我的问题是:当我更新此模型表单中的任何字段时,将生成一个新的发票号。你知道吗

有什么办法我可以更新表格,保持原来的发票号码不变!!你知道吗

class sale(models.Model):
    name = models.CharField(max_length=30,null=True)
    contact = models.IntegerField(null=True)
    email = models.EmailField(max_length=50,null=True)
    Delivery_Date = models.DateField(null=True)
    Delivery_time = models.CharField(max_length=80,null=True)
    service = models.CharField(max_length=20,null=True)
    Invoice_number = models.CharField(max_length=12,blank=True,unique=True)

    def save(self, *args, **kwargs):
        if self.service == 'Furniture':
            x=randint(99,99999)
            self.Invoice_number = str('Fur') + str(x)
        elif self.service == 'Auto':
            x=randint(99,99999)
            self.Invoice_number = str('Auto') + str(x)
        elif self.service == 'Groceries':
            x=randint(99,99999)
            self.Invoice_number = str('Gro') + str(x)
        super(bookings_modelform,self).save()

Tags: 模型selftruenumbermodelsservice发票invoice
2条回答

您可以检查实例是否已经有发票号码,例如:

...
def save(self, *args, **kwargs):
    if not self.Invoice_number:
        if self.service == 'Furniture':
            x=randint(99,99999)
            self.Invoice_number = str('Fur') + str(x)
            ...

这就是说,您的方法很容易出错,因为偶尔会出现发票号冲突(因为随机数的性质),并且save()会失败,丢失发票。我建议你先检查一下以前是否用过那个发票号码。你知道吗

您还调用了错误的super(它应该是sale的超类,而不是bookings_modelform),即:

super(sale, self).save(*args, **kwargs)

如果对象是新的,您可以签入模型的save方法,使用self.pk并仅在这种情况下生成发票号:

def save(self, *args, **kwargs):
    if self.pk is None:
        if self.service == 'Furniture':
            x=randint(99,99999)
            self.Invoice_number = str('Fur') + str(x)
        elif self.service == 'Auto':
            x=randint(99,99999)
            self.Invoice_number = str('Auto') + str(x)
        elif self.service == 'Groceries':
            x=randint(99,99999)
            self.Invoice_number = str('Gro') + str(x)
    super(bookings_modelform,self).save()

相关问题 更多 >