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

2024-10-01 15:41:29 发布

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

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

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

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时,如果SaleDetail是新的或没有设置{},则用SaleDetail.unit_price更新{}。在

我过去在javapojo中所做的就是在setter方法中包含这个逻辑。我尝试过使用python属性来封装item属性,但是Django直接在引擎盖下面更新了字段,这样会破坏一些自动功能。在

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

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

这种情况下的另一个用途是更新每个销售细节和销售总额。我想计算这之前,用户决定保存销售,所以保存信号将不起作用。在

谢谢!在


Tags: django方法模型selfmodelmodelsunit逻辑
2条回答

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

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

然后像这样使用它:

^{pr2}$

看看这对你是否有用。我们重写save方法并检查是否存在pk。如果pk不是,那么我们知道{}是新的。然后,我们看看是否存在unit_price。如果没有unit_price,我们将其设置为Item.default_price。在

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 save(self, *args, **kwargs):
        # Make sure this is the first save (pk should be None) and there is no unit_price set
        if self.pk is None and not self.unit_price:
            self.unit_price = self.item.default_price
        elif not self.unit_price:
            self.unit_price = self.item.default_price

        # Call the original save method
        super(SaleDetail, self).save(*args, **kwargs)

相关问题 更多 >

    热门问题