一般而言,问题在于寻找模型外键的修改并调用相关模型的某些功能。
假设我有两个模型类:
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来实现对数据库访存行为的实现,而该行为可以进一步更改。
我认为必须知道一个外键的修改,并且有一个适当且更容易的解决方案,我知道有一些用于存储修改历史的软件包,但对于我的简单请求来说,这些软件包太多了。