将聚合与后计算字段一起使用

奥斯曼

我在模型中有一个字段,该字段将基于两个值进行计算。现在的问题是我所有的代码都是使用手动SUMAVG

我试图做的是拥有另一种设计模型的方法,同时保持相同的逻辑。我想要这样做的主要原因是因为我需要利用djagno聚合和注释功能。另外,要在数据库端而不是在Python中计算这些值。

class Employee(models.Model):
    name = models.CharField(....)
    ..
    salary = models.FloatField(....)

class Benefit(models.Model):
    employee = models.ForeignKey('Employee')

    # this field can be
    # Percentage (ex %2 from employee main salary)
    # Fixed Price (ex $150)
    # days
    calculation_type = thetopchoices(FIX,PER,DAYS)

    # this field should be the value 
    # of the percentage or the fixed amount
    custom = models.PositiveIntegerField(....)

因此,基本上,我有一种将检查计算类型的方法,并据此获得收益的数量。

def calculate(self):
    if self.calculation_type == 'PER':
        return self.employee.salary * self.custom
    elif self.calculation_type == 'FIX':
        return self.custom
    else
        return ( self.employee.salary / 30 ) * self.custom

@property
def amount(self):
    return self.calculate()

现在的问题是如何计算每个雇员的总收益。最好的解决方案是使用Django聚合在数据库中进行计算。但是,使用这种设计将永远行不通,因为Django需要将其作为真实字段。

到目前为止,我的解决方案是有效的,但我认为它不是有效的。

def get_total_amount_of_benefits(self):
    total = 0
    for b in employee.benefit_set.all():
        total += b.amount

    return total
阿米尔·阿德南(Aamir Adnan)

我认为您应该重新定义Benefit模型,添加amount将根据model中的calculation_typecustom字段值自动计算的字段save

class Benefit(models.Model):
    employee = models.ForeignKey('Employee')

    # this field can be
    # Percentage (ex %2 from employee main salary)
    # Fixed Price (ex $150)
    # days
    calculation_type = thetopchoices(FIX,PER,DAYS)

    # this field should be the value 
    # of the percentage or the fixed amount
    custom = models.PositiveIntegerField(....)
    amount = models.PositiveIntegerField(...., editable=False) # auto calculated field in save

    def __init__(self, *args, **kwargs):
        super(Benefit, self).__init__(*args, **kwargs)
        self.__original_calc_type = self.calculation_type
        self.__original_custom = self.custom

    def calculate(self):
        employee = self.employee
        if self.calculation_type == 'PER':
            amount = employee.salary * self.custom
        elif self.calculation_type == 'FIX':
            amount = self.custom
        else
            amount = ( employee.salary / 30 ) * self.custom
        return amount

    def save(self, *args, **kwargs):
        recalculate = kwargs.pop('recalculate', False)
        if self.__original_calc_type != self.calculation_type or self.__original_custom != self.custom or recalculate:
            self.amount = self.calculate()
        super(Benefit, self).save(*args, **kwargs)
        self.__original_calc_type = self.calculation_type
        self.__original_custom = self.custom

现在轻松获得所有收益的数量:

from django.db.models import Sum

class Employee(models.Model):
    ...
    ...

    @property
    def benefits_amount(self):
        d = self.benefit_set.aggregate(total_amount=Sum('amount'))
        return d['total_amount'] if d['total_amount'] else 0

如果您以后想根据已有的条件更新福利,则需要这样做:

for benefit in employee.benefit_set.all():
    benefit.save(recalculate=True)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

toObjectId用于将字符串的字段与查找和聚合一起使用

来自分类Dev

将SQL聚合函数与多个联接一起使用

来自分类Dev

将聚合函数与内部联接一起使用

来自分类Dev

将$ exists与$ redact一起使用mongo聚合?

来自分类Dev

如何将NULLIF与聚合函数一起使用

来自分类Dev

将ROW_NUMBER()与聚合函数一起使用

来自分类Dev

将structfun与字段列表一起使用

来自分类Dev

UML是否可以将聚合和组合与两个类一起使用?

来自分类Dev

将聚合物条件属性与HAML一起使用

来自分类Dev

如何将Google Map与聚合物一起使用?

来自分类Dev

如何将聚合物(1.0)与Rails(4)一起使用?

来自分类Dev

如何将聚合与$ near猫鼬一起使用?

来自分类Dev

如何将ArrayFormula与数组一起使用(聚合之后)?

来自分类Dev

如何将Google Map与聚合物一起使用?

来自分类Dev

如何将包装材料与聚合物元件一起使用?

来自分类Dev

将聚合物条件属性与HAML一起使用

来自分类Dev

是否可以将Oracle的用户定义的聚合函数定义为与两列一起使用?

来自分类Dev

将聚合物与外部 js 文件一起使用

来自分类Dev

如何将 CountVectorizer 与聚合数据一起使用?

来自分类Dev

将聚合与自定义函数一起使用(使用基于另一列的值)

来自分类Dev

仅将输入字段的一部分与CSS一起使用

来自分类Dev

将@click方法与select标记一起使用以更改计算属性的值

来自分类Dev

将预先计算的误差线与Seaborn和Barplot一起使用

来自分类Dev

如何将“ gcloud计算操作列表”与按实例名称进行过滤一起使用?

来自分类Dev

将 TypeScript 与 DataTables 一起使用,如何计算出“this”的正确类型

来自分类Dev

将Laravel 5 Auth与自定义表字段名称一起使用?

来自分类Dev

将final字段与几个共享代码的构造函数一起使用

来自分类Dev

如何将where子句与两个字段的总和一起使用

来自分类Dev

将Logstash与Elasticsearch输出一起使用时.raw字段来自哪里?

Related 相关文章

  1. 1

    toObjectId用于将字符串的字段与查找和聚合一起使用

  2. 2

    将SQL聚合函数与多个联接一起使用

  3. 3

    将聚合函数与内部联接一起使用

  4. 4

    将$ exists与$ redact一起使用mongo聚合?

  5. 5

    如何将NULLIF与聚合函数一起使用

  6. 6

    将ROW_NUMBER()与聚合函数一起使用

  7. 7

    将structfun与字段列表一起使用

  8. 8

    UML是否可以将聚合和组合与两个类一起使用?

  9. 9

    将聚合物条件属性与HAML一起使用

  10. 10

    如何将Google Map与聚合物一起使用?

  11. 11

    如何将聚合物(1.0)与Rails(4)一起使用?

  12. 12

    如何将聚合与$ near猫鼬一起使用?

  13. 13

    如何将ArrayFormula与数组一起使用(聚合之后)?

  14. 14

    如何将Google Map与聚合物一起使用?

  15. 15

    如何将包装材料与聚合物元件一起使用?

  16. 16

    将聚合物条件属性与HAML一起使用

  17. 17

    是否可以将Oracle的用户定义的聚合函数定义为与两列一起使用?

  18. 18

    将聚合物与外部 js 文件一起使用

  19. 19

    如何将 CountVectorizer 与聚合数据一起使用?

  20. 20

    将聚合与自定义函数一起使用(使用基于另一列的值)

  21. 21

    仅将输入字段的一部分与CSS一起使用

  22. 22

    将@click方法与select标记一起使用以更改计算属性的值

  23. 23

    将预先计算的误差线与Seaborn和Barplot一起使用

  24. 24

    如何将“ gcloud计算操作列表”与按实例名称进行过滤一起使用?

  25. 25

    将 TypeScript 与 DataTables 一起使用,如何计算出“this”的正确类型

  26. 26

    将Laravel 5 Auth与自定义表字段名称一起使用?

  27. 27

    将final字段与几个共享代码的构造函数一起使用

  28. 28

    如何将where子句与两个字段的总和一起使用

  29. 29

    将Logstash与Elasticsearch输出一起使用时.raw字段来自哪里?

热门标签

归档