如何总结Django模型字段

时间:2019-05-18 10:35:14

标签: django

class Salary() :
    Basic = models. IntegerField () 
    Allowance = models. IntegerField () 
    Incentivies = models.  IntegerField () 
    gross = models. IntegerField () 
    gratuity = models. IntegerField () 
     Ctc = models. IntegerField () 

这是我的问题 毛额=基本+津贴+奖励

ctc =毛额+酬金

对此我应该如何求和,无需输入Gross或ctc的值。它应该是

4 个答案:

答案 0 :(得分:4)

最好将grossctc定义为模型方法或属性。否则会导致数据冗余。最好使用 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从数据库检索的任何薪金实例都将具有grossctc属性。

答案 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 

这个也很好