Django 如何基于相同模型的另一个字段更新模型字段

Django 如何基于相同模型的另一个字段更新模型字段,django,django-models,django-forms,django-views,locust,Django,Django Models,Django Forms,Django Views,Locust,我正在创建采购订单(po)表。创建采购订单时,我必须将采购订单编号更新为“PO0”+采购订单idex PO0123(123是主键)。因此,我在模型中使用def save来实现这一点 class PurchaseOrder(models.Model): purchase_order_id = models.AutoField(primary_key=True) purchase_order_number = models.CharField(unique=True) vend

我正在创建采购订单(po)表。创建采购订单时,我必须将采购订单编号更新为“PO0”+
采购订单id
ex PO0123(123是主键)。因此,我在模型中使用def save来实现这一点

class PurchaseOrder(models.Model):
   purchase_order_id = models.AutoField(primary_key=True)  
   purchase_order_number = models.CharField(unique=True)
   vendor = models.ForeignKey(Vendor)
单次创建可以很好地工作,但当我尝试使用Occast(测试工具)创建大量数据时,它会为PurcheOrderNumber提供一个错误
重复条目
我们可以修改模型本身中的字段值吗

def save(self):
    if self.purchase_order_id is not None:
        self.purchase_order_number = "PO"+str(self.purchase_order_id)
    return super(PurchaseOrder, self).save()

老实说,我认为当您创建多个实例时,它不应该起作用。因为正如我从代码中看到的:

purchase_order_number = models.CharField(unique=True,default=("PO"+self.purchase_order_id )
创建新实例时,
purchase\u order\u id
将成为
None
。另外,在调用
super(PurchaseOrder,self).save()之前,它不会生成
PurchaseOrder\u id
,这意味着
PurchaseOrder\u number
将为空

因此,我建议不要将这些信息存储在DB中。它基本上与
purchase\u order\u id
相同,前面有
PO
。相反,您可以使用属性方法来获取相同的值。像这样:

if self.purchase_order_id is not None:
    self.purchase_order_number = "PO"+str(self.purchase_order_id)
因此,您还可以看到如下所示的
采购订单编号

class PurchaseOrder(models.Model):
   purchase_order_id = models.AutoField(primary_key=True)
   # need to remove `purchase_order_number = models.CharField(unique=True)`
   ...

   @property 
   def purchase_order_number(self):
       return "PO{}".format(self.purchase_order_id)

此解决方案的缺点是,您无法在属性字段上进行任何更改。但我不认为这是必要的,因为您可以对
采购订单id
执行相同的查询,即
采购订单.objects.filter(采购订单id=1)

不,我想问的是它不会起作用,有没有这样的方法?问题解决了,创建采购订单后,我忘了在这里提到,在success\u url方法中,我正在获取采购订单id并修改采购订单编号“PO”+str(self.purchase\u order\u id)`谢谢回复,它不起作用。。。。你能告诉我问题出在哪里吗?我认为这是解决这个问题的最好办法。@veeresh我在回答中解释了你的解决办法不起作用的原因,并提出了解决问题的另一种方法。
p = PurchaseOrder.objects.first()
p.purchase_order_number