gpt4 book ai didi

python - Django - 基于另一个字段更新模型字段

转载 作者:太空狗 更新时间:2023-10-30 03:01:06 25 4
gpt4 key购买 nike

我是 Django 和 Python 的新手,我想做一些以前在 Java EE 中经常做的事情。

考虑以下模型(仅相关类):

class Item(models.Model):
name = models.CharField(max_length=40)
default_price = models.DecimalField(max_digits=6, decimal_places=2, default=50)

def __unicode__(self):
return self.name


class SaleDetail(models.Model):
item = models.ForeignKey(Item)
deposit = models.ForeignKey(Deposit)
quantity = models.PositiveIntegerField()
unit_price = models.DecimalField(max_digits=6, decimal_places=2)
sale = models.ForeignKey(Sale)

def item_updated(self, value):
if self.unit_price == None:
self.unit_price = value

我想做的是每次将 Item 添加到 SaleDetail 时,用 Item 更新 SaleDetail.unit_price。 default_price 如果 SaleDetail 是新的或未设置 unit_price

我过去在 Java POJO 中所做的是将此逻辑包含在 setter 方法中。我试过使用 python 属性来封装 item 属性,但 Django 直接在后台更新该字段,因此这会破坏一些自动功能。

我也尝试过子类化 ForeignKey 以接受回调函数,但我找不到调用容器类方法的方法。

我想这样做,以便我可以为 UI 提供默认值,但我不想在 View 逻辑中包含此逻辑,因为从概念上讲,我认为此逻辑应该在模型(服务器端)上

在这种情况下的其他用途是更新每个销售细节和销售的总计。我想在用户决定保存销售之前进行计算,因此保存信号将不起作用。

谢谢!

最佳答案

“单价”实际上是两个不同字段的函数。因此,我倾向于这样写:

class Item(models.Model):
name = models.CharField(max_length=40)
default_price = models.DecimalField(max_digits=6, decimal_places=2, default=50)

def __unicode__(self):
return self.name

class SaleDetail(models.Model):
item = models.ForeignKey(Item)
deposit = models.ForeignKey(Deposit)
quantity = models.PositiveIntegerField()
entered_unit_price = models.DecimalField(max_digits=6, decimal_places=2, default=None)
sale = models.ForeignKey(Sale)

@property
def unit_price(self, value):
if self.entered_unit_price is None:
return self.item.default_price
else:
return self.entered_unit_price

@unit_price.setter
def unit_price(self, value):
self.entered_unit_price = value

然后像这样使用它:

print(sd.unit_price)
sd.unit_price = 500
sd.save()

关于python - Django - 基于另一个字段更新模型字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26632784/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com