jquery - 如何计算 django 模型字段
问题描述
我的模型中有以下字段:
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) 存在于数据库中很重要。
谢谢。
解决方案
请不要将其存储在您的数据库中。如果它完全依赖于其他字段,通常最好计算列。实际上,假设您更新了其中一个字段,那么您也需要更新该字段VAT_amount
。但是如果你做了很多视图、查询等,那么最终你很可能会犯错误而忘记更新。
您可以删除该VAT_amount
字段,然后.annotate(..)
您的查询集以包含VAT_amount
,例如:
from django.db.models import F
Materiale.objects.annotate(VAT_amount=F('quantity')*F('price')*F('vat'))
从此查询集产生的Materiale
对象将有一个额外的属性,然后包含公式的结果。.VAT_amount
如果你经常需要这个,你可以将它添加到这个模型的管理器中,这样每次你访问时它都会自动完成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()
推荐阅读
- angular - Angular 6 选择输入测试
- ruby - 如何在 ruby 中从希伯来语 utf-8 中去除元音/nekudot/变音符号?
- r - 如何绘制从R中的循环中提取的单独线
- c# - 在外部 sd 卡上创建目录。(写访问错误)
- linux - 如何在当前文件夹和所有子文件夹中的所有文件中搜索特定文件内容
- c# - WebRequest 指定 SSL/TLS 密码
- ios - UICollectionView 在单元格中显示错误的图像
- python - 有关将图像添加到视频的信息
- java - 如何防止 Escape 键关闭 JFace 对话框
- java - Mockito - 未完成的存根