首页 > 解决方案 > 将 DataTimeField 模型字段值设置为 timezone.now + timezone.timedelta(hours=another_model_field)

问题描述

我正在尝试为广告添加结束日期:

class AdvertisePost(Post):
    ...
    duration = models.IntegerField(default=48)
    finish = models.DateTimeField(blank=False, null=False, default=timezone.now + timezone.timedelta(hours=duration))

duration是广告应该运行的小时数。所以我想finish等于AdvertisePost+的创建时间duration。我试图这样做:

finish = models.DateTimeField(blank=False, null=False, default=timezone.now + timezone.timedelta(hours=duration))

我被告知default=timezone.now要使用而不是default=timezone.now()因为后者将返回当前时间而不是创建时间。

至于该字段的其他部分,hours=duration则返回以下错误:

TypeError: unsupported type for timedelta hours component: IntegerField

知道如何finish才能成为一个等于AdvertisePost+ 持续时间的创建时间的日期对象吗?

编辑

模型功能:

@property
def done(self):
    return timezone.now + timezone.timedelta(hours=self.duration)

这怎么行不通?^

标签: pythondjango

解决方案


尝试将save()模型的方法覆盖为

from django.utils import timezone
from datetime import timedelta


class AdvertisePost(models.Model):
    duration = models.IntegerField(default=48)
    finish = models.DateTimeField(null=True, blank=True)

    def save(self, *args, **kwargs):
        if not self.pk:  # newly created object
            self.finish = timezone.now() + timedelta(hours=self.duration)
        super().save(*args, **kwargs)

UPDATE-1
你也可以用property装饰器来做到这一点,

from django.utils import timezone
from datetime import timedelta


class AdvertisePost(models.Model):
    duration = models.IntegerField(default=48)

    @property
    def finish(self):
        return timezone.now() + timedelta(hours=self.duration)

推荐阅读