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

Posted

技术标签:

【中文标题】Django 模型字段依赖于另一个模型字段【英文标题】:Django model field dependent on another model field 【发布时间】:2019-03-11 09:06:03 【问题描述】:

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

我很难实现这一点。 举个例子吧

模型1 字段1 字段2

模型2 model1中的field3(依赖于field1和field2)

如果我将它作为我的 web 应用程序中特定页面的一部分。这意味着如果 field1 或 field2 发生了变化,但该人没有访问汇总值并在 field3 中更新它的页面,则 field3 将携带错误的值。

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

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

这样我就不会忘记重新计算 field3 的值。

我的问题是这是最好的方法吗?有没有一种方法可以在不需要访问特定页面的情况下,每当诸如 field1 之类的依赖字段更改时自动更改 field3?

我尝试了 field3 的外键,并尝试在 model.py 中添加两个外键的值,但我认为这是不允许的。

字段 3 = 字段 1+ 字段 2

有什么建议吗?

**

为每个请求添加了以下示例以进一步澄清问题

如果您注意到交易表下的总价格是基于商品和运费的价格。但是,这需要访问 order.html 页面。

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

**

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')

【问题讨论】:

您应该能够覆盖 model1 中的保存功能并在那里添加行为,但这取决于它们如何链接在一起。然而,这听起来像是一种不寻常的设计模式,如果您分享您的完整模型,也许可以通过其他方式解决。 听起来你想要一个数据库视图...? 添加了代码来澄清我的问题。谢谢! 使用django查询表达式docs.djangoproject.com/en/3.2/ref/models/expressions 【参考方案1】:

您可以在 Shipping 和 Item 模型中覆盖保存功能。

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

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

【讨论】:

以上是关于Django 模型字段依赖于另一个模型字段的主要内容,如果未能解决你的问题,请参考以下文章

依赖于另一个字段的自动递增字段[重复]

Django模型:依赖字段

django cms 插件上的动态模型选择字段

以原子方式比较-交换 Django 中的模型字段

依赖于模型的 Django 小部件

Django 模型字段默认基于同一模型中的另一个字段