Как установить атрибут модели Django на основе другого атрибута?

У меня есть модель, которая учитывает время. Поэтому, когда я устанавливаю is_all_day как True, я хочу, чтобы мои start_hour и end_hour возвращали 6:00 и 23:59 соответственно, но они возвращают null.
Вот моя модель:

class TestModel(models.Model):
    start_hour = models.TimeField(blank=True, null=True)
    end_hour = models.TimeField(blank=True, null=True)
    is_all_day = models.BooleanField(default=True)
    class Meta:
        managed = True
        db_table = 'test_model'

    def start_all_day(self):
        if self.is_all_day == 'True':
            self.start_hour = '6:00'
            self.start_hour.save()
            return self.start_hour
        else:
            return self.start_hour

    def end_all_day(self):
        if self.is_all_day == 'True':
            self.end_hour = '23:59'
            self.end_hour.save()
            return self.end_hour
        else:
            return self.start_hour

Что я делаю не так?

Как упомянул @Andy, вы можете переопределить метод save() модели:

def save(self, *args, **kwargs):
    """Override start_hour and end_hour if is_all_day is True"""
    if self.is_all_day:
        self.start_hour = '6:00'
        self.end_hour = '23:59'
    super().save(*args, **kwargs)

Или вы также можете использовать @properties для достижения чего-то подобного:

@property
def begin(self):
    return '6:00' if self.is_all_day else self.start_hour

@property
def end(self):
    return '23:59' if self.is_all_day else self.end_hour

Пожалуйста, измените код выше, чтобы всегда обрабатывать один и тот же тип времени или строки.

Вернуться на верх