python - 将 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)
这怎么行不通?^
解决方案
尝试将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)
推荐阅读
- babeljs - 如何在 vue 项目中添加对 nullishCoalescingOperator 的 Babel 支持?
- amazon-dynamodb - 无法扫描 DynamoDB 映射嵌套属性
- java - 无法解析 spring-boot-starter-hateoas 中“Link”中的“of”方法
- python - 通过python根据列上的匹配合并不同的3个文件
- flutter - 如何监听 ChangeNotifier 内平面对象属性的变化?
- reactjs - 当我在反应中单击取消按钮时,为什么页面正在重新加载以及为什么它的路径也在反应中改变?
- javascript - 如何以特定格式从当前日期增加日期?
- python - 如何删除下面python代码中的括号?
- flutter - Flutter IOS 通知的 FCM 在应用程序处于后台或终止时不显示
- python - 更改 DataFrame 的所有行中的日期