Django:在model.save()上存储了很多方法?

时间:2016-01-29 12:04:51

标签: python django

我正在使用Django 1.9。我有一个模型,代表了某个月医生诊所的患者人数,按年龄和性别分列:

class PracticeList(models.Model):
    practice = models.ForeignKey(Practice)
    date = models.DateField()
    male_0_4 = models.IntegerField()
    female_0_4 = models.IntegerField()
    male_5_14 = models.IntegerField()
    female_5_14 = models.IntegerField() 
    ... etc
    total_list_size = models.IntegerField()
    prescribing_needs = JSONField(null=True, blank=True)

我使用整数字段的值来驱动针对年龄和性别调整的各种度量。这些数量很大且不可预测,因此使用prescribing_needs的JSONField。我最初计算并在模型的save方法上设置了这些:

    def save(self, *args, **kwargs):
        self.total_list_size = self.male_0_4 + self.female_0_4 + ....
        antibiotics = 1.2 * self.male_0_4 + 1.1 * self.female_0_4 + ...
        # plus 40-50 other calculations
        self.prescribing_needs = {
            'antibiotics': antibiotics ...
        }
        super(PracticeList, self).save(*args, **kwargs)

这很有效,但是我的模型文件难以管理。所以我的问题很简单:save上分析计算所有这些度量的方法的Django方法是什么?

现在我只是在与model_calculations.py相同的目录中创建了一个名为models.py的新文件:

def set_prescribing_needs(c):
    antibiotics = 1.1 * c.male_0_4 + 1.1 * female_0_4 ...
    prescribing_needs = {
        'antibiotics': antibiotics
    }
    return prescribing_needs

我只是将此文件导入models.py并执行:

def save(self, *args, **kwargs):
    self.prescribing_needs = model_calculations.set_prescribing_needs(self)
    super(PracticeList, self).save(*args, **kwargs)

这样可以,还是有更多的Djangoish来存储这些方法?

1 个答案:

答案 0 :(得分:0)

这是一种可行的方法,是Django的做法。我会寻找两件事。

如果您有多个应用中使用的功能,请将这些功能放在main/model_calculations.pycore/model_calculations.py或您在整个项目中共享的任何应用中。

如果您发现某些功能在模型之外使用,我会将它们放在utils.py文件中。

只要这些功能仅在单个应用程序中使用,并且仅在模型中使用,您当前存储它们就可以了。