在Django上更改外键时的操作

时间:2018-09-25 08:44:24

标签: django django-models

一般而言,问题在于寻找模型外键的修改并调用相关模型的某些功能。

假设我有两个模型类:

class Discount(models.Model):
  def use(self, sell_item):
    if self.max_price:
        self.max_price -= sell_item.net()
    if self.max_count:
        self.max_count -= sell_item.amount

    self.save()

  def deuse(self, sell_item):
    if self.max_price:
        self.max_price += sell_item.net()
    if self.max_count:
        self.max_count += sell_item.amount

    self.save()

  max_price = models.PositiveIntegerField(blank=True,
                                          null=True)
  max_count = models.PositiveIntegerField(blank=True,
                                          null=True)
  amount = models.PositiveIntegerField(blank=False,
                                       null=False)


class SellItem(models.Model):
  def net(self):
    price = self.amount * self.price
    if self.discount:
      price -= self.discount.amount * price / 100
    return price * (1 + self.tax / 100)
  amount = models.PositiveIntegerField(balnk=False,
                                       null=False)
  price = models.PositiveIntegerField(blank=False,
                                      null=False)
  tax = models.PositiveIntegerFeidl(blank=False,
                                    null=False)
  discount = models.ForeignKey(Discount,
                               blank=True,
                               null=True)

现在,我想每当有折扣添加到项目时就执行use函数,而每当从项目中删除折扣时就执行deuse函数。我找到了一个post,为此,我在下面的代码中出售了商品:

def __init__(self, *args, **kwargs):
    self.dirty = False
    self.pre_states = []
    self.new_states = []
    super(SellItem, self).__init__(*args, **kwargs)

def __setattr__(self, name, value):
    if name == 'discount':
        if hasattr(self, name):
          pre_discount = self.discount
          if pre_discount != value:
            self.dirty = True
            if pre_discount:
                self.pre_states = ['pre_discount']
                self.pre_discount = pre_discount
            if value:
                self.new_states = ['discount']

    object.__setattr__(self, name, value)

def save(self, *args, **kwargs):
    super(SellItem, self).save(*args, **kwargs)

    if self.dirty:
        if 'pre_discount' in self.pre_states:
            self.pre_discount.deuse(self)
        if 'discount' in self.new_states:
            self.discount.use(self)

但这还不够,因为基本上django在构造新类时不会获取外键,而是仅填充_id项,并且只要您需要,它将从数据库中获取它(如果我检查)根据成员值的设置顺序修改discount_id而不是discount,因为我只有当前的discount而没有{{1} }。

我知道可以通过检查所有案例来实现,但是我认为毕竟我依赖于Django来实现对数据库访存行为的实现,而该行为可以进一步更改。

我认为必须知道一个外键的修改,并且有一个适当且更容易的解决方案,我知道有一些用于存储修改历史的软件包,但对于我的简单请求来说,这些软件包太多了。

0 个答案:

没有答案