【问题标题】:How to set Django model attribute based on another attribute?如何根据另一个属性设置 Django 模型属性?
【发布时间】:2022-01-07 14:06:27
【问题描述】:

我有一个考虑时间的模型。因此,当我将 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

我在这里做错了什么?

【问题讨论】:

  • 你应该以某种方式调用这些函数(例如在你的视图函数中)或save方法

标签: python django django-models django-rest-framework django-views


【解决方案1】:

正如@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

请更改上面的代码以始终处理相同类型的时间或字符串。

【讨论】:

    猜你喜欢
    • 2020-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-03
    • 2019-12-22
    • 1970-01-01
    • 1970-01-01
    • 2019-05-21
    相关资源
    最近更新 更多