Django模型保存方法:传递原始数据以计算写入db的最终数据

时间:2014-12-12 08:48:00

标签: python django django-models

我正在通过xlrd读取Excel报告,然后通过django-report-tools创建用于批量导入的Tablib数据集。我当前的Model有一堆自定义方法,它们将保存到db的值取出,然后执行其他逻辑。

目前,模型已设置为镜像excel报告/源系统的结构,以便于导入。我现在意识到这需要我创建一堆自定义模型方法,以便我可以将我真正关心的数据返回到我的应用程序中。例如,源数据具有到期日和修订的到期日。我只对“实际到期日”感兴趣,所以我有一个方法可以回吐适当的日期。 (这只是一个例子,有很多不同的情况需要类似的卫生)。

这显然导致了我的数据库中出现了大量不必要的数据,所以我要将模型重新修改为更精确。

是否可以将单个记录的所有报告值传递到Model.save()方法中,然后在那里执行清理?我将交出一些不会保存到数据库的变量。如果是这样,你可以指出我正确的方向,因为我的谷歌搜索是空的。 Django Docs让我觉得这对我正在运行的批量作业是不可能的。但如果我不批量导入,这甚至可能吗?

或者,对我来说,更好的做法是重做导入作业以进行这些计算,然后将ORM交给原始数据集?感谢您提供的任何帮助。

**我在Python 2.7上运行Django 1.6。

1 个答案:

答案 0 :(得分:0)

可以在save方法中执行此操作,但使用ModelForm似乎更适合这种情况。像这样:

# models.py

class MyModel(models.Model):
    extracted_data_1 = models.IntegerField()
    # more fields
    ...


# forms.py

class MyModelForm(forms.ModelForm):
    cell_a = forms.IntegerField()
    cell_b = forms.IntegerField(required=False)

    def clean(self):
        cell_a = self.cleaned_data['cell_a']
        cell_b = self.cleaned_data.get('cell_b', 0)
        self.cleaned_data['extracted_data_1'] = cell_a + cell_b
        return self.cleaned_data

    class Meta:
        model = MyModel
        fields = ('cell_a', 'cell_b', 'extracted_data_1')

每个excel行都必须由表单处理,如果它有效,只需执行form.save()