我正在使用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来存储这些方法?
答案 0 :(得分:0)
这是一种可行的方法,是Django的做法。我会寻找两件事。
如果您有多个应用中使用的功能,请将这些功能放在main/model_calculations.py
,core/model_calculations.py
或您在整个项目中共享的任何应用中。
如果您发现某些功能在模型之外使用,我会将它们放在utils.py
文件中。
只要这些功能仅在单个应用程序中使用,并且仅在模型中使用,您当前存储它们就可以了。