【问题标题】:How to Update models field based on another field of same models如何根据相同模型的另一个字段更新模型字段
【发布时间】:2019-02-19 05:45:30
【问题描述】:
class PurchaseOrder(models.Model):
   purchase_order_id = models.AutoField(primary_key=True)  
   purchase_order_number = models.CharField(unique=True)
   vendor = models.ForeignKey(Vendor)

我正在创建采购订单(po)表。创建 po 时,我必须将purchase_order_number 更新为“PO0”+purchase_order_id ex PO0123(123 是主键)。所以我在模型中使用 def save 来完成这个

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()

单次创建可以正常工作,但是当我尝试使用 locust(测试工具)创建大量数据时,它会给出错误duplicate entry for PurchseOrdernumber 我们可以在模型本身中修改字段值吗?

purchase_order_number = models.CharField(unique=True,default=("PO"+self.purchase_order_id )

【问题讨论】:

  • 不,我问的是不行,有没有这样的方法?
  • 问题得到解决我忘了在这里提到,在创建采购订单后,在success_url方法中我正在使用purchase_order_id并修改purchase_order_number`“PO”+str(self.purchase_order_id)`

标签: django django-models django-forms django-views locust


【解决方案1】:

说实话,我认为创建多个实例时它不应该起作用。因为从代码中可以看出:

if self.purchase_order_id is not None:
    self.purchase_order_number = "PO"+str(self.purchase_order_id)

当您创建新实例时,这里的 purchase_order_id 将是 None。另外,在你调用super(PurchaseOrder, self).save()之前,它不会生成purchase_order_id,这意味着purchase_order_number将为空。

所以,我建议不要将此信息存储在数据库中。它与purchase_order_id基本相同,前面有PO。相反,您可以使用属性方法来获取相同的值。像这样:

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)

所以,你也可以像这样看到purchase_order_number

p = PurchaseOrder.objects.first()
p.purchase_order_number

此解决方案的缺点是,您不能在属性字段上创建任何query。但我认为无论如何都没有必要,因为您可以对purchase_order_id 进行相同的查询,即PurchaseOrder.objects.filter(purchase_order_id=1)

【讨论】:

  • 感谢您的回复,它不工作....你能告诉我什么问题吗?
  • 我认为这是本案的最佳解决方案。
  • @veeresh 我确实在回答中解释了为什么您的解决方案不起作用,并建议了另一种解决问题的方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-08-08
  • 1970-01-01
  • 2014-12-25
  • 2021-09-30
  • 1970-01-01
  • 1970-01-01
  • 2021-10-11
相关资源
最近更新 更多