我有课:
class PurchaseOrder(models.Model):
product = models.ManyToManyField('Product')
dollar_amount = models.FloatField(verbose_name='Total Price')
def total_price(self):
return sum([p.price_for_each_item for p in self.product.all()])
我能把总价定义的回报保存成美元金额吗?我想在我的生活中这样做管理员.py我将能够调用美元金额到搜索字段和其他一些可能的字段。你知道吗
在性能和获得所需的准确行为方面,需要考虑一些因素。您可能会问以下几个问题:
如果这是采购订单的完整实现,那么我猜您只需创建并保存一次
PurchaseOrder
对象,然后多次检索它。我想,当相关产品的价格发生变化时,你不希望总数发生变化,但这只是一个猜测。如果你真的想改变它,你必须实现类似于我建议的逻辑,如果你允许人们编辑他们的订单,但是你必须在Product
模型本身上实现它。你知道吗现在有两种不同的情况:
你不允许人们改变他们的命令
这是一个简单的例子,因为您只需要检索一次
dollar_amount
,然后保存它。我建议使用一个私有字段来表示实际金额,并使用一个属性来访问private属性,如果还没有设置的话,就设置它。通常您会重写save
方法来添加数据,但在这种情况下,您需要依赖多对多关系才能存在,因此必须至少保存一次模型,然后才能获得总价:您允许用户通过添加/删除项目来更改订单
这会变得更复杂一些。每当在您的采购订单和产品之间创建新的关系时,或者每当删除一个关系时,您都需要更新
dollar_amount
。您可能还希望在添加产品时保存产品的价格,否则,如果在从订单中删除产品之前更改了价格,您可能会扣除错误的金额。由于似乎没有一种方法可以覆盖相关管理器上的add()
和delete()
方法等,因此必须指定一个自定义through
模型:这将使从采购订单添加或删除项目变得复杂,因为常规的
self.product.add()
和self.product.delete()
方法不可用。您必须手动创建OrderItem
并保存它,但我认为没有更简单的方法。你知道吗相关问题 更多 >
编程相关推荐