class Salary() :
Basic = models. IntegerField ()
Allowance = models. IntegerField ()
Incentivies = models. IntegerField ()
gross = models. IntegerField ()
gratuity = models. IntegerField ()
Ctc = models. IntegerField ()
这是我的问题 毛额=基本+津贴+奖励
ctc =毛额+酬金
对此我应该如何求和,无需输入Gross或ctc的值。它应该是
答案 0 :(得分:4)
最好将gross
和ctc
定义为模型方法或属性。否则会导致数据冗余。最好使用 snake_casing 作为字段名称。
class Salary() :
basic = models.IntegerField()
allowance = models.IntegerField()
incentives = models.IntegerField()
gratuity = models.IntegerField()
@property
def gross(self):
return self.basic + self.allowance + self.incentives
@property
def ctc(self):
return self.gross + self.gratuity
答案 1 :(得分:3)
如果总和始终成立,最好为这些字段创建字段。实际上,通过创建字段,这可能导致某些更新可能打破约束的事实。是的,Django具有在保存模型时可以触发的信号等,但是某些ORM调用(例如.update(..)
)会规避这些信号。
通常最好注明总和。这意味着数据库中没有显式字段,但是您指示数据库在必要时计算字段。因此,这节省了数据库的磁盘空间,而且使该关系不成立是不可能的。
我们可以如下定义注释管理器:
from django.db import models
class AnnotationManager(models.Manager):
def __init__(self, **kwargs):
super().__init__()
self.annotations = kwargs
def get_queryset(self):
return super().get_queryset().annotate(**self.annotations)
然后我们可以将此管理器添加到Salary
模型中:
from django.db import models
from django.db.models import F
class Salary(models.Model):
basic = models.IntegerField()
allowance = models.IntegerField()
incentives = models.IntegerField()
gratuity = models.IntegerField()
_gross = None
_ctc = None
objects = AnnotationManager(
gross=F('basic')+F('allowance')+F('incentives'),
ctc=F('gross')+F('gratuity')
)
我们还可以过滤这些列,例如:
Salary.objects.filter(gross__gt=100)
将检索Salary
大于gross
的所有100
对象。这里的过滤是在数据库级别完成的,而不是在Python级别完成的。 Django会在类似以下的查询中翻译以上内容:
SELECT salary.*,
salary.basic + salary.allowance + salary.incentives AS gross,
salary.basic + salary.allowance + salary.incentives + salary.gratuity AS ctc
FROM salary
WHERE salary.basic + salary.allowance + salary.incentives > 100
答案 2 :(得分:1)
akhilsp's answer就位了,您应该使用模型方法进行计算。
您还可以在数据库中计算这些值。
salaries = Salary.objects.annotate(
gross = F('basic') + F('allowance') + F('incentives'),
ctc = F('gross') + F('gratuity')
)
您甚至可以创建一个自定义管理器,以便始终对其进行计算:
from django.db.models import Manager, Model
SalaryManager(Manager):
def get_queryset(self):
return super().get_queryset.annotate(
gross = F('basic') + F('allowance') + F('incentives'),
ctc = F('gross') + F('gratuity')
)
class Salary(Model):
... # Other fields
objects = SalaryManager()
然后,使用ORM从数据库检索的任何薪金实例都将具有gross
和ctc
属性。
答案 3 :(得分:0)
@receiver(pre_save, sender=OfferLetter)
def my_callback(sender, instance, *args, **kwargs):
instance.gross_salary = instance.basic+instance.conveyance_allowance+instance.special_allowance
这个也很好