【问题标题】:How to calculate django model fields如何计算 django 模型字段
【发布时间】:2020-08-06 00:46:06
【问题描述】:

我的模型中有以下字段:

class Materiale(models.Model):
    quantity=models.DecimalField(max_digits=5, decimal_places=2, default=0)
    price=models.DecimalField( max_digits=5, decimal_places=2, default=0)
    VAT=models.DecimalField(max_digits=5, decimal_places=2, default=0)
    VAT_amount=models.DecimalField(max_digits=5, decimal_places=2, default=0)

但 VAT_amount 是 quantity*price*VAT 的结果。

如何在我的数据库中自动存储该值???字段 (VAT_amount) 是很重要的 存在于数据库中。

谢谢。

【问题讨论】:

  • 你用的是什么数据库?

标签: jquery django django-models django-rest-framework django-views


【解决方案1】:

请不要将此存储在您的数据库中。如果它完全依赖于其他字段,通常最好计算该列。实际上,假设您更新其中一个字段,那么您还需要更新VAT_amount。但是如果你做了很多视图、查询等,那么最终你很可能会犯错误而忘记更新。

您可以删除VAT_amount 字段,然后将.annotate(..) 删除您的查询集以包含VAT_amount,例如:

from django.db.models import F

Materiale.objects.annotate(VAT_amount=F('quantity')*F('price')*F('vat'))

this 查询集产生的 Materiale 对象将有一个额外的属性 .VAT_amount 然后包含公式的结果。

如果你经常需要这个,你可以把它添加到这个模型的manager中,这样每次你访问Materiale.objects时它都会自动完成:

class MetarialeManager(models.Manager):

    def get_queryset(self, *args, **kwargs):
        return super().get_queryset(*args, **kwargs).annotate(
            VAT_amount=F('quantity')*F('price')*F('vat')
        )

class Materiale(models.Model):
    quantity=models.DecimalField(max_digits=5, decimal_places=2, default=0)
    price=models.DecimalField( max_digits=5, decimal_places=2, default=0)
    VAT=models.DecimalField(max_digits=5, decimal_places=2, default=0)

    objects = MaterialeManager()

【讨论】:

  • 为什么不让它成为一个属性呢?
  • @VishalSingh:因为有了注解,还可以在数据库端进行过滤,在其他注解中使用等
  • @WillemVanOnsem 谢谢你,它工作得很好。只有一个问题:如果我希望 VAT_amount 只有两位小数?我怎样才能得到这个?
猜你喜欢
  • 1970-01-01
  • 2013-07-14
  • 1970-01-01
  • 2018-03-16
  • 1970-01-01
  • 2016-06-28
  • 1970-01-01
  • 2022-01-18
相关资源
最近更新 更多