Django模型字段依赖于另一个模型字段

时间:2018-10-05 20:10:25

标签: django

我有一个普遍的问题。假设我有一个模型字段,该字段是不同模型中其他两个字段的总和。

我很难实现这一目标。 让我们来看下面的例子

模型1 栏位1 field2

model2 模型1中的field3(取决于field1和field2)

如果我将其作为webapp中特定页面的一部分进行操作。这意味着,如果field1或field2已更改,但该人没有访问汇总该值并在field3中进行更新的页面,则field3将携带错误的值。

解决这个我设法确定的问题的唯一方法是永远不要创建field3。每次求和(或任何其他依赖于其他字段的操作)发生时,都应在view.py

中的变量中进行。

这意味着每次需要计算值。

这样,我就不会陷入忘记重新计算field3值的位置。

我的问题是这是最好的方法吗?有没有一种方法,只要有变化的字段(例如field1)发生更改,而无需访问特定页面,该字段便会自动更改field3?

我尝试了使用field3的foriegn键进行某些操作,并尝试在model.py中添加两个foriegn键的值,但我认为这是不允许的。

field3 =字段1+字段2

有什么建议吗?

**

  • 为每个请求添加了以下示例,以进一步阐明问题

如果您注意到交易表下的totalPrice基于物料和运输的价格。但是,这需要访问order.html页面。

我的问题是,是否有人更改了导致价格不同的商品。然后,如果不访问order.html页面,交易表中的totalprice将不会反映新价格。是否有一种方法可以构建“交易”模型,从而在不需要访问order.html页面的情况下更新其依赖的其他任何字段的情况下,可以更新totalprice?

**

models.py

class Item(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE, null=True)
    price = models.FloatField(null=True)

class Shipping(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE, null=True)
    price = models.FloatField(null=True)

class Transaction(models.Model):
     user = models.ForeignKey(User, on_delete=models.CASCADE, null=True)
     total_price = models.FloatField(null=True)

views.py
def order(request):
    item_obj = item.object.get(user=self.user)
    ship_obj = shipping.object.get(user=self.user)
    trans_obj = transaction.object.get(user=self.user)

    trans_obj.total_price = item_obj.price + ship_obj.price
    trans_obj.save()
    return render(request, 'order.html')

1 个答案:

答案 0 :(得分:0)

您可以在运输和项目模型中覆盖保存功能。

def save(self, *args, **kwargs):
    #change total_price
    # Transaction.save(update_fields['total_price'])
    super(Item, self).save(*args, **kwargs)

但是,“#change total_price”将取决于您如何关联模型以及如何找到合适的运输对象