在Django中覆盖保存与自定义字段

时间:2015-02-28 13:38:06

标签: django field admin

我正在为django app编写代码,我需要一个来自同一模型中其他2个值的模型字段。

我创建了这个字段,因为我想将它的值存储在de DB中,而不是将它的值保留为views / admin中的编码逻辑。到目前为止,我已经通过在保存之前调用模型方法的填充脚本存储了所有值。

我面临的问题是我不知道如何创建一个可以从人口脚本调用的解决方案(每天称为cron活动)和默认的django结构(主要是管理员和视图)。

我希望能够通过管理员更改表单进行编辑,但间接(更改其他2个值),如果可能,则显示它。

我应该创建自定义字段还是覆盖保存方法? 是否可以避免在创建字段时为字段赋值? 我可以写一个默认值和blank = true,但不能确保我的值是正确的。

Models.py

class Valores(models.Model):
    TARIFAS = (
        ('1', '2.0A'),
        ('2', '2.0DHA'),
        ('3', '2.0DHS'),
        # (None, 'Elije una tarifa')
    )

    PERIODO_TAR = (
        ('1', 'Punta'),
        ('2', 'Valle'),
        ('3', 'Supervalle'),
        # (None, 'Elije una tarifa')
    )

    PERIODO_HOR = (
        ('1', '00-01'),
        ('2', '01-02'),
        ('3', '02-03'),
        ('4', '03-04'),
        ('5', '04-05'),
        ('6', '05-06'),
        ('7', '06-07'),
        ('8', '07-08'),
        ('9', '08-09'),
        ('10', '09-10'),
        ('11', '10-11'),
        ('12', '11-12'),
        ('13', '12-13'),
        ('14', '13-14'),
        ('15', '14-15'),
        ('16', '15-16'),
        ('17', '16-17'),
        ('18', '17-18'),
        ('19', '18-19'),
        ('20', '19-20'),
        ('21', '20-21'),
        ('22', '21-22'),
        ('23', '22-23'),
        ('24', '23-24'),  # (None, 'Elije un periodo horario')
    )

    per_hor = models.IntegerField(
        'periodo horario',
        choices=PERIODO_HOR
    )
    per_tar = models.IntegerField(
        'periodo tarifario',
        choices=PERIODO_TAR
    )
    tar = models.IntegerField(
        'tarifa',
        choices=TARIFAS
    )

    def periodo_tarifario(self):
        # Devuelve el periodo tarifario
        if self.tar == 1:
            return 1

        elif self.tar == 2:
            if 12 < self.per_hor < 23:
                return 1
            else:
                return 2

        elif self.tar == 3:
            if 1 < self.per_hor < 8:
                return 3
            elif 8 < self.per_hor < 14 or self.per_hor == 1 or self.per_hor == 24:
                return 2
            else:
                return 1

1 个答案:

答案 0 :(得分:1)

如何使用以下结构:

class MyModel(models.Model):
    A_Field=models.IntegerField()
    B_Field=models.IntegerField()
    C_Field=models.IntegerField(null=True, blank=True)#this is the generated field

    def get_C(self):
        return self.A_Field+self.B_Field

    def save(self, force_insert=False, force_update=False):
        self.C_Field=self.get_C()
        super(MyModel, self).save(force_insert, force_update)

分配一个已经正确的默认值(例如字段定义中的default = get_C)将失败,因为A_Field和B_Field在调用它时没有值。如果你需要在更改时立即评估它表单中的A和B,您将需要使用JS来执行此操作。